diff --git a/api/__init__.py b/api/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/api/__pycache__/__init__.cpython-312.pyc b/api/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000..c75ff36 Binary files /dev/null and b/api/__pycache__/__init__.cpython-312.pyc differ diff --git a/api/__pycache__/admin.cpython-312.pyc b/api/__pycache__/admin.cpython-312.pyc new file mode 100644 index 0000000..50b0bd2 Binary files /dev/null and b/api/__pycache__/admin.cpython-312.pyc differ diff --git a/api/__pycache__/apps.cpython-312.pyc b/api/__pycache__/apps.cpython-312.pyc new file mode 100644 index 0000000..623323c Binary files /dev/null and b/api/__pycache__/apps.cpython-312.pyc differ diff --git a/api/__pycache__/models.cpython-312.pyc b/api/__pycache__/models.cpython-312.pyc new file mode 100644 index 0000000..3741750 Binary files /dev/null and b/api/__pycache__/models.cpython-312.pyc differ diff --git a/api/admin.py b/api/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/api/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/api/apps.py b/api/apps.py new file mode 100644 index 0000000..66656fd --- /dev/null +++ b/api/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class ApiConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'api' diff --git a/api/migrations/__init__.py b/api/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/api/migrations/__pycache__/__init__.cpython-312.pyc b/api/migrations/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000..9b6bd14 Binary files /dev/null and b/api/migrations/__pycache__/__init__.cpython-312.pyc differ diff --git a/api/models.py b/api/models.py new file mode 100644 index 0000000..71a8362 --- /dev/null +++ b/api/models.py @@ -0,0 +1,3 @@ +from django.db import models + +# Create your models here. diff --git a/api/serializers/__pycache__/event.cpython-312.pyc b/api/serializers/__pycache__/event.cpython-312.pyc new file mode 100644 index 0000000..9ed34f3 Binary files /dev/null and b/api/serializers/__pycache__/event.cpython-312.pyc differ diff --git a/api/serializers/event.py b/api/serializers/event.py new file mode 100644 index 0000000..f4824c6 --- /dev/null +++ b/api/serializers/event.py @@ -0,0 +1,10 @@ +from rest_framework import serializers + +from web.models import Event + + +class EventSerializer(serializers.ModelSerializer): + + class Meta: + model = Event + fields = '__all__' diff --git a/api/views/__pycache__/event.cpython-312.pyc b/api/views/__pycache__/event.cpython-312.pyc new file mode 100644 index 0000000..2ddc421 Binary files /dev/null and b/api/views/__pycache__/event.cpython-312.pyc differ diff --git a/api/views/event.py b/api/views/event.py new file mode 100644 index 0000000..e95ba52 --- /dev/null +++ b/api/views/event.py @@ -0,0 +1,112 @@ +from rest_framework.views import APIView +from django.contrib.auth.models import User +from django.shortcuts import get_object_or_404 + +from api.serializers.event import EventSerializer +from common.build_response import build_response +from web.models import Event, EventDivision + + +class EventView(APIView): + def get(self, request, event_id): + try: + event = get_object_or_404(Event, pk=event_id) + except Exception: + return build_response(404) + + try: + event_serializer = EventSerializer(event) + except Exception: + return build_response(422) + + return build_response(data=event_serializer.data) + + def post(self, request): + data = request.POST + + try: + division = get_object_or_404(EventDivision, pk=data.get('division')) + except Exception: + return build_response(500, message="Unable to retrieve division info") + + try: + user = User.objects.filter(email=data.get('created_by')).first() + except Exception: + return build_response(500, message="Could not find user!") + + try: + new_event = Event( + name=data.get("name"), + description=data.get("description"), + division=division, + start_date=data.get('start_date'), + end_date=data.get('end_date'), + submit_by_date=data.get('submit_by_date'), + chosen_date=None, + created_by=user + ) + + new_event.save() + except Exception: + return build_response(500, message="Unable to create new event!") + + try: + event_serializer = EventSerializer(new_event) + except Exception: + return build_response(422) + + return build_response(200, data=event_serializer.data) + + def put(self,request, event_id): + try: + event = get_object_or_404(Event, pk=event_id) + except Exception: + return build_response(404) + + data = request.POST + + try: + division = get_object_or_404(EventDivision, pk=data.get('division')) + except Exception: + return build_response(500, message="Unable to retrieve division info") + + try: + event.name = data.get('name', event.name) + event.description = data.get('description', event.description) + event.division = None + event.start_date = data.get('start_date', event.start_date) + event.end_date = data.get('end_date', event.end_date) + event.submit_by_date = data.get('submit_by_date', event.submit_by_date) + event.chosen_date = data.get('chosen_date', event.chosen_date) + event.created_by = data.get('created_by', event.created_by) + + event.save() + + except Exception: + build_response(500, message='Unable to update event') + + try: + event_serializer = EventSerializer(event) + except Exception: + return build_response(422) + + return build_response(200, data=event_serializer.data) + + def delete(self, request, event_id): + try: + event = get_object_or_404(Event, pk=event_id) + except Exception: + return build_response(404) + + try: + event.active = False + event.save() + except Exception: + return build_response(500, message="Unable to deactivate event") + + try: + event_serializer = EventSerializer(event) + except Exception: + return build_response(422) + + return build_response(204, data=event_serializer) diff --git a/common/__pycache__/build_response.cpython-312.pyc b/common/__pycache__/build_response.cpython-312.pyc new file mode 100644 index 0000000..2c46583 Binary files /dev/null and b/common/__pycache__/build_response.cpython-312.pyc differ diff --git a/common/build_response.py b/common/build_response.py new file mode 100644 index 0000000..7a8e305 --- /dev/null +++ b/common/build_response.py @@ -0,0 +1,30 @@ +import sys +import traceback + +from rest_framework.response import Response + + +status_code_message_map = { + 204: 'Successfully deleted entity.', + 403: 'User does not have access to this entity.', + 404: 'No entity matches the given query', + 500: 'Something went wrong!' +} + + +def build_response(status_code=200, data=None, message=None): + response = Response() + response.status_code = status_code + + if response.status_code == 200: + response.data = data + else: + response.data = {} + response.data['message'] = message if message else status_code_message_map.get(status_code) + + exc_info = sys.exc_info() + exception_info = ''.join(traceback.format_exception(*exc_info)) + response.data['details'] = exception_info + + return response + diff --git a/db.sqlite3 b/db.sqlite3 index c754ade..ba7df29 100644 Binary files a/db.sqlite3 and b/db.sqlite3 differ diff --git a/korabo/settings.py b/korabo/settings.py index 57a6871..000e0ba 100644 --- a/korabo/settings.py +++ b/korabo/settings.py @@ -35,13 +35,15 @@ CSRF_TRUSTED_ORIGINS = ['https://korabo.domdit.com'] INSTALLED_APPS = [ 'web', + 'api', 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', - 'bootstrap5' + 'bootstrap5', + 'rest_framework' ] MIDDLEWARE = [ diff --git a/korabo/urls.py b/korabo/urls.py index dfa6079..6580d12 100644 --- a/korabo/urls.py +++ b/korabo/urls.py @@ -16,9 +16,14 @@ Including another URLconf """ from django.contrib import admin from django.urls import path, include + +from api.views.event import EventView from web import views + urlpatterns = [ + path('api/event/', EventView.as_view(), name='event'), + path('api/event/', EventView.as_view(), name='event'), path("accounts/", include("django.contrib.auth.urls")), path('admin/', admin.site.urls), path("", views.index, name="index"), diff --git a/requests/event_post.py b/requests/event_post.py new file mode 100644 index 0000000..d6e832d --- /dev/null +++ b/requests/event_post.py @@ -0,0 +1,21 @@ +import requests + + +url = 'http://127.0.0.1:8000/api/event/' + +data = { + 'name': 'this is a test', + 'description': 'Some long ass description', + 'start_date': '2025-03-28T23:30:00Z', + 'end_date': '2025-04-04T23:30:00Z', + 'submit_by_date': '2025-04-03T23:30:00Z', + 'created_by': 'me@domdit.com', + 'division': 1 + +} + + +resp = requests.post(url, data=data) +print(resp.status_code) +print('------------') +print(resp.json()) diff --git a/requests/event_put.py b/requests/event_put.py new file mode 100644 index 0000000..3541688 --- /dev/null +++ b/requests/event_put.py @@ -0,0 +1,20 @@ +import requests + + +url = "http://127.0.0.1:8000/api/event/3" + +data = { + "name": "this is a test and a change", + # 'description': 'Some long ass description', + # 'start_date': '2025-03-28T23:30:00Z', + "end_date": "2025-04-07T23:30:00Z", + # 'submit_by_date': '2025-04-03T23:30:00Z', + # 'created_by': 'me@domdit.com', + "division": 2, +} + + +resp = requests.put(url, data=data) +print(resp.status_code) +print("------------") +print(resp.json()) diff --git a/requirements.txt b/requirements.txt index 10f55cf..2bb3ece 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,8 +1,14 @@ asgiref==3.8.1 beautifulsoup4==4.12.3 +certifi==2025.1.31 +charset-normalizer==3.4.1 Django==4.2.16 django-bootstrap-v5==1.0.11 +djangorestframework==3.15.2 gunicorn==23.0.0 +idna==3.10 packaging==24.1 +requests==2.32.3 soupsieve==2.6 sqlparse==0.5.1 +urllib3==2.3.0 diff --git a/web/admin.py b/web/admin.py index 9c6efc5..e56974e 100644 --- a/web/admin.py +++ b/web/admin.py @@ -1,6 +1,21 @@ from django.contrib import admin -from web.models import Event, EventAdmin, Availability +from web.models import ( + Event, + EventAdmin, + Availability, + EventComment, + EventCommentReaction, + EventCommentReactionAdmin, + EventDivision, + EventDivisionAdmin, + SharedEvent, + SharedEventAdmin +) admin.site.register(Event, EventAdmin) admin.site.register(Availability) +admin.site.register(EventComment) +admin.site.register(EventCommentReaction, EventCommentReactionAdmin) +admin.site.register(EventDivision, EventDivisionAdmin) +admin.site.register(SharedEvent, SharedEventAdmin) diff --git a/web/migrations/0001_initial.py b/web/migrations/0001_initial.py index 5107a35..4506b7d 100644 --- a/web/migrations/0001_initial.py +++ b/web/migrations/0001_initial.py @@ -1,7 +1,8 @@ -# Generated by Django 5.1.2 on 2024-10-22 20:31 +# Generated by Django 4.2.16 on 2025-03-29 00:40 -import django.db.models.deletion +from django.conf import settings from django.db import migrations, models +import django.db.models.deletion class Migration(migrations.Migration): @@ -9,6 +10,7 @@ class Migration(migrations.Migration): initial = True dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), ] operations = [ @@ -20,14 +22,82 @@ class Migration(migrations.Migration): ('active', models.BooleanField(default=True)), ('id', models.AutoField(primary_key=True, serialize=False)), ('name', models.TextField()), + ('description', models.TextField()), ('start_date', models.DateTimeField()), ('end_date', models.DateTimeField()), + ('submit_by_date', models.DateTimeField()), + ('chosen_date', models.DateTimeField()), ('participants', models.IntegerField()), + ('created_by', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), ], options={ 'db_table': 'events', }, ), + migrations.CreateModel( + name='EventComment', + fields=[ + ('created_at', models.DateTimeField(auto_now_add=True, null=True)), + ('updated_at', models.DateTimeField(auto_now=True, null=True)), + ('active', models.BooleanField(default=True)), + ('id', models.AutoField(primary_key=True, serialize=False)), + ('content', models.TextField()), + ('event', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='web.event')), + ('submitted_by', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + options={ + 'db_table': 'events_comments', + }, + ), + migrations.CreateModel( + name='EventDivision', + fields=[ + ('created_at', models.DateTimeField(auto_now_add=True, null=True)), + ('updated_at', models.DateTimeField(auto_now=True, null=True)), + ('active', models.BooleanField(default=True)), + ('id', models.AutoField(primary_key=True, serialize=False)), + ('name', models.CharField(blank=True, max_length=255, null=True)), + ('description', models.TextField(blank=True, null=True)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='SharedEvent', + fields=[ + ('created_at', models.DateTimeField(auto_now_add=True, null=True)), + ('updated_at', models.DateTimeField(auto_now=True, null=True)), + ('active', models.BooleanField(default=True)), + ('id', models.AutoField(primary_key=True, serialize=False)), + ('event', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='web.event')), + ('shared_by', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='shared_by', to=settings.AUTH_USER_MODEL)), + ('shared_to', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='shared_to', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'db_table': 'shared_event', + }, + ), + migrations.CreateModel( + name='EventCommentReaction', + fields=[ + ('created_at', models.DateTimeField(auto_now_add=True, null=True)), + ('updated_at', models.DateTimeField(auto_now=True, null=True)), + ('active', models.BooleanField(default=True)), + ('id', models.AutoField(primary_key=True, serialize=False)), + ('reaction', models.CharField(blank=True, default=None, max_length=8)), + ('event_comment', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='web.eventcomment')), + ('submitted_by', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + options={ + 'db_table': 'event_comment_reactions', + }, + ), + migrations.AddField( + model_name='event', + name='division', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='web.eventdivision'), + ), migrations.CreateModel( name='Availability', fields=[ @@ -35,12 +105,12 @@ class Migration(migrations.Migration): ('updated_at', models.DateTimeField(auto_now=True, null=True)), ('active', models.BooleanField(default=True)), ('id', models.AutoField(primary_key=True, serialize=False)), - ('user', models.TextField()), ('time_table', models.JSONField()), ('event_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='web.event')), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), ], options={ - 'db_table': 'availabilities', + 'db_table': 'availability', }, ), ] diff --git a/web/migrations/0002_alter_availability_user.py b/web/migrations/0002_alter_availability_user.py deleted file mode 100644 index 4fdf65b..0000000 --- a/web/migrations/0002_alter_availability_user.py +++ /dev/null @@ -1,21 +0,0 @@ -# Generated by Django 4.2.16 on 2024-10-24 17:59 - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('web', '0001_initial'), - ] - - operations = [ - migrations.AlterField( - model_name='availability', - name='user', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), - ), - ] diff --git a/web/migrations/0002_alter_event_chosen_date_alter_event_participants.py b/web/migrations/0002_alter_event_chosen_date_alter_event_participants.py new file mode 100644 index 0000000..0ae7ae9 --- /dev/null +++ b/web/migrations/0002_alter_event_chosen_date_alter_event_participants.py @@ -0,0 +1,23 @@ +# Generated by Django 4.2.16 on 2025-03-29 01:20 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('web', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='event', + name='chosen_date', + field=models.DateTimeField(blank=True, null=True), + ), + migrations.AlterField( + model_name='event', + name='participants', + field=models.IntegerField(default=1), + ), + ] diff --git a/web/migrations/0003_alter_event_participants.py b/web/migrations/0003_alter_event_participants.py new file mode 100644 index 0000000..a951367 --- /dev/null +++ b/web/migrations/0003_alter_event_participants.py @@ -0,0 +1,18 @@ +# Generated by Django 4.2.16 on 2025-03-29 01:23 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('web', '0002_alter_event_chosen_date_alter_event_participants'), + ] + + operations = [ + migrations.AlterField( + model_name='event', + name='participants', + field=models.IntegerField(blank=True, default=1), + ), + ] diff --git a/web/migrations/__pycache__/0001_initial.cpython-312.pyc b/web/migrations/__pycache__/0001_initial.cpython-312.pyc index f6f6b17..9e8d1d0 100644 Binary files a/web/migrations/__pycache__/0001_initial.cpython-312.pyc and b/web/migrations/__pycache__/0001_initial.cpython-312.pyc differ diff --git a/web/migrations/__pycache__/0002_alter_availability_user.cpython-312.pyc b/web/migrations/__pycache__/0002_alter_availability_user.cpython-312.pyc index 70e69e8..26c7dd3 100644 Binary files a/web/migrations/__pycache__/0002_alter_availability_user.cpython-312.pyc and b/web/migrations/__pycache__/0002_alter_availability_user.cpython-312.pyc differ diff --git a/web/migrations/__pycache__/0002_alter_event_chosen_date_alter_event_participants.cpython-312.pyc b/web/migrations/__pycache__/0002_alter_event_chosen_date_alter_event_participants.cpython-312.pyc new file mode 100644 index 0000000..b5c4d33 Binary files /dev/null and b/web/migrations/__pycache__/0002_alter_event_chosen_date_alter_event_participants.cpython-312.pyc differ diff --git a/web/migrations/__pycache__/0003_alter_event_participants.cpython-312.pyc b/web/migrations/__pycache__/0003_alter_event_participants.cpython-312.pyc new file mode 100644 index 0000000..182fb7c Binary files /dev/null and b/web/migrations/__pycache__/0003_alter_event_participants.cpython-312.pyc differ diff --git a/web/migrations/__pycache__/__init__.cpython-312.pyc b/web/migrations/__pycache__/__init__.cpython-312.pyc index b45851f..aa99198 100644 Binary files a/web/migrations/__pycache__/__init__.cpython-312.pyc and b/web/migrations/__pycache__/__init__.cpython-312.pyc differ diff --git a/web/models.py b/web/models.py deleted file mode 100644 index f303552..0000000 --- a/web/models.py +++ /dev/null @@ -1,38 +0,0 @@ -from django.contrib import admin -from django.db import models -from django.contrib.auth.models import User - - - -class BaseModel(models.Model): - created_at = models.DateTimeField(blank=True, null=True, auto_now_add=True) - updated_at = models.DateTimeField(blank=True, null=True, auto_now=True) - active = models.BooleanField(default=True) - - class Meta: - abstract = True - - -class Event(BaseModel): - id = models.AutoField(primary_key=True) - name = models.TextField(blank=False, null=False) - start_date = models.DateTimeField(blank=False, null=False) - end_date = models.DateTimeField(blank=False, null=False) - participants = models.IntegerField(blank=False) - - class Meta: - db_table = 'events' - - -class EventAdmin(admin.ModelAdmin): - list_display = ('name', 'start_date', 'end_date', 'active') - - -class Availability(BaseModel): - id = models.AutoField(primary_key=True) - event_id = models.ForeignKey(Event, on_delete=models.CASCADE) - user = models.ForeignKey(User, on_delete=models.CASCADE) - time_table = models.JSONField() - - class Meta: - db_table = 'availabilities' diff --git a/web/models/__init__.py b/web/models/__init__.py new file mode 100644 index 0000000..46b6566 --- /dev/null +++ b/web/models/__init__.py @@ -0,0 +1,7 @@ +from .availability import Availability +from .event import Event, EventAdmin +from .event_comment import EventComment, EventCommentAdmin +from .event_comment_reaction import EventCommentReaction, EventCommentReactionAdmin +from .event_division import EventDivision, EventDivisionAdmin +from .shared_event import SharedEvent, SharedEventAdmin + diff --git a/web/models/__pycache__/__init__.cpython-312.pyc b/web/models/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000..681a0dd Binary files /dev/null and b/web/models/__pycache__/__init__.cpython-312.pyc differ diff --git a/web/models/__pycache__/availability.cpython-312.pyc b/web/models/__pycache__/availability.cpython-312.pyc new file mode 100644 index 0000000..5bfa28b Binary files /dev/null and b/web/models/__pycache__/availability.cpython-312.pyc differ diff --git a/web/models/__pycache__/base.cpython-312.pyc b/web/models/__pycache__/base.cpython-312.pyc new file mode 100644 index 0000000..32ba4e7 Binary files /dev/null and b/web/models/__pycache__/base.cpython-312.pyc differ diff --git a/web/models/__pycache__/event.cpython-312.pyc b/web/models/__pycache__/event.cpython-312.pyc new file mode 100644 index 0000000..c3af78d Binary files /dev/null and b/web/models/__pycache__/event.cpython-312.pyc differ diff --git a/web/models/__pycache__/event_comment.cpython-312.pyc b/web/models/__pycache__/event_comment.cpython-312.pyc new file mode 100644 index 0000000..d087c29 Binary files /dev/null and b/web/models/__pycache__/event_comment.cpython-312.pyc differ diff --git a/web/models/__pycache__/event_comment_reaction.cpython-312.pyc b/web/models/__pycache__/event_comment_reaction.cpython-312.pyc new file mode 100644 index 0000000..6179b18 Binary files /dev/null and b/web/models/__pycache__/event_comment_reaction.cpython-312.pyc differ diff --git a/web/models/__pycache__/event_division.cpython-312.pyc b/web/models/__pycache__/event_division.cpython-312.pyc new file mode 100644 index 0000000..4674dd9 Binary files /dev/null and b/web/models/__pycache__/event_division.cpython-312.pyc differ diff --git a/web/models/__pycache__/shared_event.cpython-312.pyc b/web/models/__pycache__/shared_event.cpython-312.pyc new file mode 100644 index 0000000..06722ea Binary files /dev/null and b/web/models/__pycache__/shared_event.cpython-312.pyc differ diff --git a/web/models/availability.py b/web/models/availability.py new file mode 100644 index 0000000..075103c --- /dev/null +++ b/web/models/availability.py @@ -0,0 +1,15 @@ +from django.db import models +from django.contrib.auth.models import User + +from web.models.base import BaseModel +from web.models.event import Event + + +class Availability(BaseModel): + id = models.AutoField(primary_key=True) + event_id = models.ForeignKey(Event, on_delete=models.CASCADE) + user = models.ForeignKey(User, on_delete=models.CASCADE) + time_table = models.JSONField() + + class Meta: + db_table = 'availability' diff --git a/web/models/base.py b/web/models/base.py new file mode 100644 index 0000000..2b5a850 --- /dev/null +++ b/web/models/base.py @@ -0,0 +1,10 @@ +from django.db import models + + +class BaseModel(models.Model): + created_at = models.DateTimeField(blank=True, null=True, auto_now_add=True) + updated_at = models.DateTimeField(blank=True, null=True, auto_now=True) + active = models.BooleanField(default=True) + + class Meta: + abstract = True diff --git a/web/models/event.py b/web/models/event.py new file mode 100644 index 0000000..9e85d1c --- /dev/null +++ b/web/models/event.py @@ -0,0 +1,25 @@ +from django.contrib import admin +from django.contrib.auth.models import User +from django.db import models + +from web.models.base import BaseModel +from web.models.event_division import EventDivision + + +class Event(BaseModel): + id = models.AutoField(primary_key=True) + name = models.TextField(blank=False, null=False) + description = models.TextField(blank=False, null=False) + division = models.ForeignKey(EventDivision, on_delete=models.CASCADE) + start_date = models.DateTimeField(blank=False, null=False) + end_date = models.DateTimeField(blank=False, null=False) + submit_by_date = models.DateTimeField(blank=False, null=False) + chosen_date = models.DateTimeField(blank=True, null=True) + created_by = models.ForeignKey(User, on_delete=models.CASCADE) + + class Meta: + db_table = 'events' + + +class EventAdmin(admin.ModelAdmin): + list_display = ('name', 'start_date', 'end_date', 'active', 'created_by') diff --git a/web/models/event_comment.py b/web/models/event_comment.py new file mode 100644 index 0000000..3c748fd --- /dev/null +++ b/web/models/event_comment.py @@ -0,0 +1,20 @@ +from django.contrib import admin +from django.contrib.auth.models import User +from django.db import models + +from web.models.base import BaseModel +from web.models.event import Event + + +class EventComment(BaseModel): + id = models.AutoField(primary_key=True) + event = models.ForeignKey(Event, on_delete=models.CASCADE) + content = models.TextField(blank=False, null=False) + submitted_by = models.ForeignKey(User, on_delete=models.CASCADE) + + class Meta: + db_table = 'events_comments' + + +class EventCommentAdmin(admin.ModelAdmin): + list_display = ('event', 'content', 'submitted_by') diff --git a/web/models/event_comment_reaction.py b/web/models/event_comment_reaction.py new file mode 100644 index 0000000..3d8c036 --- /dev/null +++ b/web/models/event_comment_reaction.py @@ -0,0 +1,20 @@ +from django.contrib import admin +from django.contrib.auth.models import User +from django.db import models + +from web.models.base import BaseModel +from web.models.event_comment import EventComment + + +class EventCommentReaction(BaseModel): + id = models.AutoField(primary_key=True) + reaction = models.CharField(default=None, blank=True, max_length=8) + event_comment = models.ForeignKey(EventComment, on_delete=models.CASCADE) + submitted_by = models.ForeignKey(User, on_delete=models.CASCADE) + + class Meta: + db_table = 'event_comment_reactions' + + +class EventCommentReactionAdmin(admin.ModelAdmin): + list_display = ('event_comment', 'reaction', 'submitted_by') diff --git a/web/models/event_division.py b/web/models/event_division.py new file mode 100644 index 0000000..638138d --- /dev/null +++ b/web/models/event_division.py @@ -0,0 +1,14 @@ +from django.contrib import admin +from django.db import models + +from web.models.base import BaseModel + + +class EventDivision(BaseModel): + id = models.AutoField(primary_key=True) + name = models.CharField(blank=True, null=True, max_length=255) + description = models.TextField(blank=True, null=True) + + +class EventDivisionAdmin(admin.ModelAdmin): + list_display = ('name', ) diff --git a/web/models/shared_event.py b/web/models/shared_event.py new file mode 100644 index 0000000..cbc90cb --- /dev/null +++ b/web/models/shared_event.py @@ -0,0 +1,20 @@ +from django.contrib import admin +from django.contrib.auth.models import User +from django.db import models + +from web.models.base import BaseModel +from web.models.event import Event + + +class SharedEvent(BaseModel): + id = models.AutoField(primary_key=True) + event = models.ForeignKey(Event, on_delete=models.CASCADE) + shared_by = models.ForeignKey(User, on_delete=models.CASCADE, related_name='shared_by') + shared_to = models.ForeignKey(User, on_delete=models.CASCADE, related_name='shared_to') + + class Meta: + db_table = 'shared_event' + + +class SharedEventAdmin(admin.ModelAdmin): + list_display = ('shared_by', 'shared_to', 'event')