Skip to content

Commit af4645b

Browse files
authored
Merge pull request #21 from zimurgh/third-places-8
Add initial models
2 parents e60bb2b + c7cb58c commit af4645b

5 files changed

Lines changed: 203 additions & 1 deletion

File tree

.gitignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,3 +15,7 @@ src/django/static
1515
src/django/db.sqlite3
1616
*-310.pyc
1717
*/__pycache__/
18+
19+
# IDE/Text Editor configs
20+
.vscode
21+
.idea

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ and this project adheres to release number versioning.
1111

1212
- Set up React and Django boilerplate [#1](https://github.com/CodeForPhilly/third-places/pull/1)
1313
- Added Docker containers with docker-compose [#10](https://github.com/CodeForPhilly/third-places/pull/10)
14+
- Added initial Django models & migration [#21](https://github.com/CodeForPhilly/third-places/pull/21)
1415

1516
### Changed
1617

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
# Generated by Django 4.2 on 2023-05-03 04:05
2+
3+
import django.contrib.gis.db.models.fields
4+
from django.db import migrations, models
5+
import django.db.models.deletion
6+
7+
8+
class Migration(migrations.Migration):
9+
10+
initial = True
11+
12+
dependencies = [
13+
('auth', '0012_alter_user_first_name_max_length'),
14+
]
15+
16+
operations = [
17+
migrations.CreateModel(
18+
name='BusinessHours',
19+
fields=[
20+
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
21+
('day', models.CharField(choices=[('MON', 'Monday'), ('TUE', 'Tuesday'), ('WED', 'Wednesday'), ('THU', 'Thursday'), ('FRI', 'Friday'), ('SAT', 'Saturday'), ('SUN', 'Sunday')], max_length=3)),
22+
('open_time', models.TimeField()),
23+
('close_time', models.TimeField()),
24+
],
25+
),
26+
migrations.CreateModel(
27+
name='Location',
28+
fields=[
29+
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
30+
('location', django.contrib.gis.db.models.fields.PointField(srid=4326)),
31+
('name', models.TextField()),
32+
('address', models.TextField()),
33+
('price_category', models.CharField(max_length=5)),
34+
('created_datetime', models.DateTimeField()),
35+
('modified_datetime', models.DateTimeField()),
36+
('hours', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='api.businesshours')),
37+
],
38+
),
39+
migrations.CreateModel(
40+
name='LocationType',
41+
fields=[
42+
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
43+
('code', models.CharField(max_length=20)),
44+
('name', models.TextField()),
45+
],
46+
),
47+
migrations.CreateModel(
48+
name='TagType',
49+
fields=[
50+
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
51+
('code', models.CharField(max_length=20)),
52+
('name', models.TextField()),
53+
],
54+
),
55+
migrations.CreateModel(
56+
name='ThirdPlaceUser',
57+
fields=[
58+
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
59+
('password', models.CharField(max_length=128, verbose_name='password')),
60+
('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')),
61+
('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')),
62+
('email', models.EmailField(max_length=254, unique=True)),
63+
('display_name', models.TextField()),
64+
('created_datetime', models.DateTimeField()),
65+
('modified_datetime', models.DateTimeField()),
66+
('groups', models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='thirdplaceuser_groups', related_query_name='thirdplaceuser', to='auth.group', verbose_name='groups')),
67+
('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='thirdplaceuser_user_permissions', related_query_name='thirdplaceuser', to='auth.permission', verbose_name='user permissions')),
68+
],
69+
options={
70+
'abstract': False,
71+
},
72+
),
73+
migrations.CreateModel(
74+
name='Tag',
75+
fields=[
76+
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
77+
('name', models.TextField()),
78+
('value', models.DecimalField(decimal_places=1, max_digits=2)),
79+
('created_datetime', models.DateTimeField()),
80+
('modified_datetime', models.DateTimeField()),
81+
('locations', models.ManyToManyField(related_name='tags', to='api.location')),
82+
('tag_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='api.tagtype')),
83+
],
84+
),
85+
migrations.AddField(
86+
model_name='location',
87+
name='location_type',
88+
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='api.locationtype'),
89+
),
90+
]

src/django/api/models.py

Lines changed: 107 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,109 @@
11
from django.db import models
2+
from django.contrib.gis.db import models as gis_models
3+
from django.contrib.auth.models import PermissionsMixin
4+
from django.contrib.auth.base_user import AbstractBaseUser
5+
from django.contrib.auth.models import Group, Permission
26

3-
# Create your models here.
7+
8+
class BusinessHours(models.Model):
9+
WEEKDAYS = (
10+
('MON', 'Monday'),
11+
('TUE', 'Tuesday'),
12+
('WED', 'Wednesday'),
13+
('THU', 'Thursday'),
14+
('FRI', 'Friday'),
15+
('SAT', 'Saturday'),
16+
('SUN', 'Sunday')
17+
)
18+
19+
day = models.CharField(choices=WEEKDAYS, max_length=3)
20+
open_time = models.TimeField()
21+
close_time = models.TimeField()
22+
23+
REQUIRED_FIELDS = ["day"]
24+
25+
def __str__(self):
26+
return f'{self.day}: {self.open_time} - {self.close_time}'
27+
28+
29+
class LocationType(models.Model):
30+
code = models.CharField(max_length=20)
31+
name = models.TextField()
32+
33+
REQUIRED_FIELDS = ["code", "name"]
34+
35+
def __str__(self):
36+
return self.code
37+
38+
39+
class TagType(models.Model):
40+
code = models.CharField(max_length=20)
41+
name = models.TextField()
42+
43+
REQUIRED_FIELDS = ["code", "name"]
44+
45+
def __str__(self):
46+
return self.code
47+
48+
49+
class Location(models.Model):
50+
location = gis_models.PointField()
51+
name = models.TextField()
52+
address = models.TextField()
53+
hours = models.ForeignKey(BusinessHours, on_delete=models.CASCADE)
54+
location_type = models.ForeignKey(LocationType, on_delete=models.CASCADE)
55+
price_category = models.CharField(max_length=5)
56+
created_datetime = models.DateTimeField()
57+
modified_datetime = models.DateTimeField()
58+
59+
REQUIRED_FIELDS = ["location", "location_type", "created_datetime", "modified_datetime"]
60+
61+
def __str__(self):
62+
return self.name
63+
64+
65+
class Tag(models.Model):
66+
name = models.TextField()
67+
locations = models.ManyToManyField(Location, related_name='tags')
68+
tag_type = models.ForeignKey(TagType, on_delete=models.CASCADE)
69+
value = models.DecimalField(decimal_places=1, max_digits=2)
70+
created_datetime = models.DateTimeField()
71+
modified_datetime = models.DateTimeField()
72+
73+
REQUIRED_FIELDS = ["name", "tag_type", "value", "created_datetime", "modified_datetime"]
74+
75+
def __str__(self):
76+
return self.name
77+
78+
79+
class ThirdPlaceUser(AbstractBaseUser, PermissionsMixin):
80+
email = models.EmailField(unique=True)
81+
display_name = models.TextField()
82+
created_datetime = models.DateTimeField()
83+
modified_datetime = models.DateTimeField()
84+
85+
groups = models.ManyToManyField(
86+
Group,
87+
blank=True,
88+
related_name='thirdplaceuser_groups',
89+
verbose_name='groups',
90+
help_text=('The groups this user belongs to. A user will '
91+
'get all permissions granted to each of their '
92+
'groups.'),
93+
related_query_name='thirdplaceuser',
94+
)
95+
96+
user_permissions = models.ManyToManyField(
97+
Permission,
98+
blank=True,
99+
related_name='thirdplaceuser_user_permissions',
100+
verbose_name='user permissions',
101+
help_text='Specific permissions for this user.',
102+
related_query_name='thirdplaceuser',
103+
)
104+
105+
USERNAME_FIELD = "email"
106+
REQUIRED_FIELDS = ["email", "username", "display_name", "created_datetime", "modified_datetime"]
107+
108+
def __str__(self):
109+
return self.email

src/django/thirdplaces/settings.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
"django.contrib.sessions",
3939
"django.contrib.messages",
4040
"django.contrib.staticfiles",
41+
"api"
4142
]
4243

4344
MIDDLEWARE = [

0 commit comments

Comments
 (0)