diff --git a/.deepsource.toml b/.deepsource.toml new file mode 100644 index 0000000000..9cde54eb57 --- /dev/null +++ b/.deepsource.toml @@ -0,0 +1,21 @@ +version = 1 + +test_patterns = ["tests/**"] + +exclude_patterns = ["migrations/**"] + +[[analyzers]] +name = "python" +enabled = true + + [analyzers.meta] + runtime_version = "3.x.x" + max_line_length = 90 + +[[analyzers]] +name = "test-coverage" +enabled = true + +[[analyzers]] +name = "docker" +enabled = true \ No newline at end of file diff --git a/.gitignore b/.gitignore index e9a5816dc4..ec4639d084 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,5 @@ __pycache__/ .tool-versions Pipfile* .env +.vscode/ +**/.DS_Store diff --git a/discount_code_tickets/__init__.py b/discount_code_tickets/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/discount_code_tickets/admin.py b/discount_code_tickets/admin.py new file mode 100644 index 0000000000..846f6b4061 --- /dev/null +++ b/discount_code_tickets/admin.py @@ -0,0 +1 @@ +# Register your models here. diff --git a/discount_code_tickets/apps.py b/discount_code_tickets/apps.py new file mode 100644 index 0000000000..4f28fa3112 --- /dev/null +++ b/discount_code_tickets/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class DiscountCodeTicketsConfig(AppConfig): + default_auto_field = "django.db.models.BigAutoField" + name = "discount_code_tickets" diff --git a/discount_code_tickets/migrations/0001_initial.py b/discount_code_tickets/migrations/0001_initial.py new file mode 100644 index 0000000000..c406172fc6 --- /dev/null +++ b/discount_code_tickets/migrations/0001_initial.py @@ -0,0 +1,20 @@ +# Generated by Django 5.0 on 2024-03-12 03:59 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='DiscountCodeTicket', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ], + ), + ] diff --git a/discount_code_tickets/migrations/0002_initial.py b/discount_code_tickets/migrations/0002_initial.py new file mode 100644 index 0000000000..eecd7b5996 --- /dev/null +++ b/discount_code_tickets/migrations/0002_initial.py @@ -0,0 +1,28 @@ +# Generated by Django 5.0 on 2024-03-12 03:59 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('discount_code_tickets', '0001_initial'), + ('events', '0001_initial'), + ('tickets', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='discountcodeticket', + name='event', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='events.event'), + ), + migrations.AddField( + model_name='discountcodeticket', + name='ticket', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='tickets.ticket'), + ), + ] diff --git a/discount_code_tickets/migrations/__init__.py b/discount_code_tickets/migrations/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/discount_code_tickets/models.py b/discount_code_tickets/models.py new file mode 100644 index 0000000000..ce88e71a6d --- /dev/null +++ b/discount_code_tickets/models.py @@ -0,0 +1,10 @@ +from django.db import models + +from events.models import Event +from tickets.models import Ticket + + +# Create your models here. +class DiscountCodeTicket(models.Model): + event = models.ForeignKey(Event, on_delete=models.CASCADE) + ticket = models.ForeignKey(Ticket, on_delete=models.CASCADE) diff --git a/discount_code_tickets/tests.py b/discount_code_tickets/tests.py new file mode 100644 index 0000000000..a39b155ac3 --- /dev/null +++ b/discount_code_tickets/tests.py @@ -0,0 +1 @@ +# Create your tests here. diff --git a/discount_code_tickets/views.py b/discount_code_tickets/views.py new file mode 100644 index 0000000000..60f00ef0ef --- /dev/null +++ b/discount_code_tickets/views.py @@ -0,0 +1 @@ +# Create your views here. diff --git a/discount_codes/__init__.py b/discount_codes/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/discount_codes/admin.py b/discount_codes/admin.py new file mode 100644 index 0000000000..846f6b4061 --- /dev/null +++ b/discount_codes/admin.py @@ -0,0 +1 @@ +# Register your models here. diff --git a/discount_codes/apps.py b/discount_codes/apps.py new file mode 100644 index 0000000000..9aeeb6e2ad --- /dev/null +++ b/discount_codes/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class DiscountCodesConfig(AppConfig): + default_auto_field = "django.db.models.BigAutoField" + name = "discount_codes" diff --git a/discount_codes/migrations/0001_initial.py b/discount_codes/migrations/0001_initial.py new file mode 100644 index 0000000000..3fa8bfa7a6 --- /dev/null +++ b/discount_codes/migrations/0001_initial.py @@ -0,0 +1,34 @@ +# Generated by Django 5.0 on 2024-03-12 03:59 + +import django.contrib.postgres.fields.citext +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='DiscountCode', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('code', django.contrib.postgres.fields.citext.CICharField(max_length=255, null=True, unique=True)), + ('value', models.FloatField()), + ('type', models.CharField(max_length=255)), + ('is_active', models.BooleanField(blank=True, null=True)), + ('tickets_number', models.IntegerField(blank=True, null=True)), + ('min_quantity', models.IntegerField(blank=True, null=True)), + ('max_quantity', models.IntegerField(blank=True, null=True)), + ('valid_from', models.DateTimeField(blank=True, null=True)), + ('valid_till', models.DateTimeField(blank=True, null=True)), + ('created_at', models.DateTimeField(blank=True, null=True)), + ('used_for', models.CharField(max_length=255)), + ('discount_url', models.URLField(blank=True, null=True)), + ('deleted_at', models.DateTimeField(blank=True, null=True)), + ], + ), + ] diff --git a/discount_codes/migrations/0002_initial.py b/discount_codes/migrations/0002_initial.py new file mode 100644 index 0000000000..41831a97d2 --- /dev/null +++ b/discount_codes/migrations/0002_initial.py @@ -0,0 +1,29 @@ +# Generated by Django 5.0 on 2024-03-12 03:59 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('discount_codes', '0001_initial'), + ('events', '0001_initial'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.AddField( + model_name='discountcode', + name='associated_event', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='events.event'), + ), + migrations.AddField( + model_name='discountcode', + name='marketer', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/discount_codes/migrations/__init__.py b/discount_codes/migrations/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/discount_codes/models.py b/discount_codes/models.py new file mode 100644 index 0000000000..77aa45a76e --- /dev/null +++ b/discount_codes/models.py @@ -0,0 +1,23 @@ +from django.contrib.postgres.fields import CICharField +from django.db import models + +from users.models import CustomUser + + +class DiscountCode(models.Model): + code = CICharField(max_length=255, unique=True, null=True) + value = models.FloatField() + type = models.CharField(max_length=255) + is_active = models.BooleanField(null=True, blank=True) + tickets_number = models.IntegerField(null=True, blank=True) + min_quantity = models.IntegerField(null=True, blank=True) + max_quantity = models.IntegerField(null=True, blank=True) + valid_from = models.DateTimeField(null=True, blank=True) + valid_till = models.DateTimeField(null=True, blank=True) + associated_event = models.ForeignKey("events.Event", on_delete=models.SET_NULL, null=True, blank=True) + # Use 'associated_event' to avoid naming conflict. Using'events.Event' as a string to avoid circular import. + created_at = models.DateTimeField(null=True, blank=True) + marketer = models.ForeignKey(CustomUser, on_delete=models.SET_NULL, null=True, blank=True) + used_for = models.CharField(max_length=255) + discount_url = models.URLField(blank=True, null=True) + deleted_at = models.DateTimeField(null=True, blank=True) diff --git a/discount_codes/tests.py b/discount_codes/tests.py new file mode 100644 index 0000000000..a39b155ac3 --- /dev/null +++ b/discount_codes/tests.py @@ -0,0 +1 @@ +# Create your tests here. diff --git a/discount_codes/views.py b/discount_codes/views.py new file mode 100644 index 0000000000..60f00ef0ef --- /dev/null +++ b/discount_codes/views.py @@ -0,0 +1 @@ +# Create your views here. diff --git a/event_sub_topics/__init__.py b/event_sub_topics/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/event_sub_topics/admin.py b/event_sub_topics/admin.py new file mode 100644 index 0000000000..846f6b4061 --- /dev/null +++ b/event_sub_topics/admin.py @@ -0,0 +1 @@ +# Register your models here. diff --git a/event_sub_topics/apps.py b/event_sub_topics/apps.py new file mode 100644 index 0000000000..fd2f4499da --- /dev/null +++ b/event_sub_topics/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class EventSubTopicsConfig(AppConfig): + default_auto_field = "django.db.models.BigAutoField" + name = "event_sub_topics" diff --git a/event_sub_topics/migrations/0001_initial.py b/event_sub_topics/migrations/0001_initial.py new file mode 100644 index 0000000000..bdcc3490dc --- /dev/null +++ b/event_sub_topics/migrations/0001_initial.py @@ -0,0 +1,25 @@ +# Generated by Django 5.0 on 2024-03-12 03:59 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('event_topics', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='EventSubTopic', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=200)), + ('slug', models.CharField(max_length=200)), + ('event_type', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='event_topics.eventtopic')), + ], + ), + ] diff --git a/event_sub_topics/migrations/__init__.py b/event_sub_topics/migrations/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/event_sub_topics/models.py b/event_sub_topics/models.py new file mode 100644 index 0000000000..ddbb8eae76 --- /dev/null +++ b/event_sub_topics/models.py @@ -0,0 +1,10 @@ +from django.db import models + +from event_topics.models import EventTopic + + +# Create your models here. +class EventSubTopic(models.Model): + name = models.CharField(max_length=200) + slug = models.CharField(max_length=200) + event_type = models.ForeignKey(EventTopic, on_delete=models.SET_NULL, null=True, blank=True) diff --git a/event_sub_topics/tests.py b/event_sub_topics/tests.py new file mode 100644 index 0000000000..a39b155ac3 --- /dev/null +++ b/event_sub_topics/tests.py @@ -0,0 +1 @@ +# Create your tests here. diff --git a/event_sub_topics/views.py b/event_sub_topics/views.py new file mode 100644 index 0000000000..60f00ef0ef --- /dev/null +++ b/event_sub_topics/views.py @@ -0,0 +1 @@ +# Create your views here. diff --git a/event_types/__init__.py b/event_types/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/event_types/admin.py b/event_types/admin.py new file mode 100644 index 0000000000..846f6b4061 --- /dev/null +++ b/event_types/admin.py @@ -0,0 +1 @@ +# Register your models here. diff --git a/event_types/apps.py b/event_types/apps.py new file mode 100644 index 0000000000..4bc6f1a883 --- /dev/null +++ b/event_types/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class EventTypesConfig(AppConfig): + default_auto_field = "django.db.models.BigAutoField" + name = "event_types" diff --git a/event_types/migrations/0001_initial.py b/event_types/migrations/0001_initial.py new file mode 100644 index 0000000000..f7e89140e0 --- /dev/null +++ b/event_types/migrations/0001_initial.py @@ -0,0 +1,23 @@ +# Generated by Django 5.0 on 2024-03-12 03:59 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='EventType', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=200)), + ('slug', models.CharField(max_length=200)), + ('deleted_at', models.DateTimeField(blank=True, null=True)), + ], + ), + ] diff --git a/event_types/migrations/__init__.py b/event_types/migrations/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/event_types/models.py b/event_types/models.py new file mode 100644 index 0000000000..2211ae0d92 --- /dev/null +++ b/event_types/models.py @@ -0,0 +1,11 @@ +from django.db import models + + +# Create your models here. +class EventType(models.Model): + name = models.CharField(max_length=200) + slug = models.CharField(max_length=200) + deleted_at = models.DateTimeField(null=True, blank=True) + + def __str__(self): + return self.name diff --git a/event_types/tests.py b/event_types/tests.py new file mode 100644 index 0000000000..a39b155ac3 --- /dev/null +++ b/event_types/tests.py @@ -0,0 +1 @@ +# Create your tests here. diff --git a/event_types/views.py b/event_types/views.py new file mode 100644 index 0000000000..60f00ef0ef --- /dev/null +++ b/event_types/views.py @@ -0,0 +1 @@ +# Create your views here. diff --git a/events/__init__.py b/events/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/events/admin.py b/events/admin.py new file mode 100644 index 0000000000..846f6b4061 --- /dev/null +++ b/events/admin.py @@ -0,0 +1 @@ +# Register your models here. diff --git a/events/apps.py b/events/apps.py new file mode 100644 index 0000000000..8c9099aa7e --- /dev/null +++ b/events/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class EventsConfig(AppConfig): + default_auto_field = "django.db.models.BigAutoField" + name = "events" diff --git a/events/migrations/0001_initial.py b/events/migrations/0001_initial.py new file mode 100644 index 0000000000..e6c435636a --- /dev/null +++ b/events/migrations/0001_initial.py @@ -0,0 +1,110 @@ +# Generated by Django 5.0 on 2024-03-12 03:59 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('discount_codes', '0001_initial'), + ('event_sub_topics', '0001_initial'), + ('event_topics', '0001_initial'), + ('event_types', '0001_initial'), + ('groups', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='Event', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('identifier', models.CharField(max_length=255)), + ('name', models.CharField(max_length=255)), + ('external_event_url', models.URLField(blank=True, null=True)), + ('logo_url', models.URLField(blank=True, null=True)), + ('starts_at', models.DateTimeField()), + ('ends_at', models.DateTimeField()), + ('timezone', models.CharField(max_length=255)), + ('latitude', models.FloatField(blank=True, null=True)), + ('longitude', models.FloatField(blank=True, null=True)), + ('location_name', models.CharField(blank=True, max_length=255, null=True)), + ('searchable_location_name', models.CharField(blank=True, max_length=255, null=True)), + ('description', models.TextField(blank=True, null=True)), + ('original_image_url', models.URLField(blank=True, null=True)), + ('thumbnail_image_url', models.URLField(blank=True, null=True)), + ('large_image_url', models.URLField(blank=True, null=True)), + ('icon_image_url', models.URLField(blank=True, null=True)), + ('owner_name', models.CharField(blank=True, max_length=255, null=True)), + ('is_map_shown', models.BooleanField(default=True, null=True)), + ('owner_description', models.CharField(blank=True, max_length=255, null=True)), + ('is_sessions_speakers_enabled', models.BooleanField(blank=True, null=True)), + ('privacy', models.CharField(blank=True, max_length=255, null=True)), + ('state', models.CharField(blank=True, max_length=255, null=True)), + ('ticket_url', models.URLField(blank=True, null=True)), + ('code_of_conduct', models.TextField(blank=True, null=True)), + ('schedule_published_on', models.DateTimeField(blank=True, null=True)), + ('is_ticketing_enabled', models.BooleanField(blank=True, null=True)), + ('deleted_at', models.DateTimeField(blank=True, null=True)), + ('payment_country', models.CharField(blank=True, max_length=255, null=True)), + ('payment_currency', models.CharField(blank=True, max_length=255, null=True)), + ('paypal_email', models.EmailField(blank=True, max_length=254, null=True)), + ('is_tax_enabled', models.BooleanField(blank=True, null=True)), + ('can_pay_by_paypal', models.BooleanField(default=False)), + ('can_pay_by_stripe', models.BooleanField(default=False)), + ('can_pay_by_cheque', models.BooleanField(default=False)), + ('can_pay_by_bank', models.BooleanField(default=False)), + ('can_pay_onsite', models.BooleanField(default=False)), + ('cheque_details', models.TextField(blank=True, null=True)), + ('bank_details', models.TextField(blank=True, null=True)), + ('onsite_details', models.TextField(blank=True, null=True)), + ('created_at', models.DateTimeField(blank=True, null=True)), + ('is_sponsors_enabled', models.BooleanField(blank=True, default=False, null=True)), + ('ical_url', models.URLField(blank=True, null=True)), + ('pentabarf_url', models.URLField(blank=True, null=True)), + ('xcal_url', models.URLField(blank=True, null=True)), + ('has_owner_info', models.BooleanField(blank=True, null=True)), + ('refund_policy', models.TextField(blank=True, null=True)), + ('is_stripe_linked', models.BooleanField(blank=True, null=True)), + ('online', models.BooleanField(default=False)), + ('is_donation_enabled', models.BooleanField(blank=True, null=True)), + ('is_featured', models.BooleanField(default=False)), + ('can_pay_by_omise', models.BooleanField(default=False)), + ('is_ticket_form_enabled', models.BooleanField(default=True)), + ('can_pay_by_alipay', models.BooleanField(default=False)), + ('show_remaining_tickets', models.BooleanField(default=False)), + ('is_billing_info_mandatory', models.BooleanField(default=False)), + ('can_pay_by_paytm', models.BooleanField(default=False)), + ('is_promoted', models.BooleanField(default=False)), + ('is_demoted', models.BooleanField(default=False)), + ('after_order_message', models.TextField(blank=True, null=True)), + ('is_chat_enabled', models.BooleanField(default=False)), + ('chat_room_id', models.CharField(blank=True, max_length=255, null=True)), + ('document_links', models.JSONField(blank=True, null=True)), + ('is_document_enabled', models.BooleanField(default=False)), + ('is_videoroom_enabled', models.BooleanField(default=False)), + ('is_oneclick_signup_enabled', models.BooleanField(default=False)), + ('is_cfs_enabled', models.BooleanField(default=False)), + ('is_announced', models.BooleanField(default=False)), + ('completed_order_sales', models.IntegerField(blank=True, null=True)), + ('placed_order_sales', models.IntegerField(blank=True, null=True)), + ('pending_order_sales', models.IntegerField(blank=True, null=True)), + ('completed_order_tickets', models.IntegerField(blank=True, null=True)), + ('placed_order_tickets', models.IntegerField(blank=True, null=True)), + ('pending_order_tickets', models.IntegerField(blank=True, null=True)), + ('can_pay_by_invoice', models.BooleanField(default=False)), + ('invoice_details', models.TextField(blank=True, null=True)), + ('public_stream_link', models.URLField(blank=True, null=True)), + ('stream_loop', models.BooleanField(blank=True, null=True)), + ('stream_autoplay', models.BooleanField(blank=True, null=True)), + ('is_badges_enabled', models.BooleanField(blank=True, null=True)), + ('discount_code', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='discount_codes.discountcode')), + ('event_sub_topic', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='event_sub_topics.eventsubtopic')), + ('event_topic', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='event_topics.eventtopic')), + ('event_type', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='event_types.eventtype')), + ('group', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='groups.group')), + ], + ), + ] diff --git a/events/migrations/__init__.py b/events/migrations/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/events/models.py b/events/models.py new file mode 100644 index 0000000000..f399c16d3a --- /dev/null +++ b/events/models.py @@ -0,0 +1,95 @@ +from django.db import models + +from discount_codes.models import DiscountCode +from event_sub_topics.models import EventSubTopic +from event_topics.models import EventTopic +from event_types.models import EventType +from groups.models import Group + + +# Create your models here. +class Event(models.Model): + identifier = models.CharField(max_length=255) + name = models.CharField(max_length=255) + external_event_url = models.URLField(blank=True, null=True) + logo_url = models.URLField(blank=True, null=True) + starts_at = models.DateTimeField() + ends_at = models.DateTimeField() + timezone = models.CharField(max_length=255) + latitude = models.FloatField(blank=True, null=True) + longitude = models.FloatField(blank=True, null=True) + location_name = models.CharField(max_length=255, blank=True, null=True) + searchable_location_name = models.CharField(max_length=255, blank=True, null=True) + description = models.TextField(blank=True, null=True) + original_image_url = models.URLField(blank=True, null=True) + thumbnail_image_url = models.URLField(blank=True, null=True) + large_image_url = models.URLField(blank=True, null=True) + icon_image_url = models.URLField(blank=True, null=True) + owner_name = models.CharField(max_length=255, blank=True, null=True) + is_map_shown = models.BooleanField(default=True, null=True) + owner_description = models.CharField(max_length=255, blank=True, null=True) + is_sessions_speakers_enabled = models.BooleanField(null=True, blank=True) + privacy = models.CharField(max_length=255, blank=True, null=True) + state = models.CharField(max_length=255, blank=True, null=True) + event_type = models.ForeignKey(EventType, on_delete=models.SET_NULL, null=True, blank=True) + event_topic = models.ForeignKey(EventTopic, on_delete=models.SET_NULL, null=True, blank=True) + event_sub_topic = models.ForeignKey(EventSubTopic, on_delete=models.SET_NULL, null=True, blank=True) + ticket_url = models.URLField(blank=True, null=True) + code_of_conduct = models.TextField(blank=True, null=True) + schedule_published_on = models.DateTimeField(null=True, blank=True) + is_ticketing_enabled = models.BooleanField(null=True, blank=True) + deleted_at = models.DateTimeField(null=True, blank=True) + payment_country = models.CharField(max_length=255, blank=True, null=True) + payment_currency = models.CharField(max_length=255, blank=True, null=True) + paypal_email = models.EmailField(blank=True, null=True) + is_tax_enabled = models.BooleanField(null=True, blank=True) + can_pay_by_paypal = models.BooleanField(default=False) + can_pay_by_stripe = models.BooleanField(default=False) + can_pay_by_cheque = models.BooleanField(default=False) + can_pay_by_bank = models.BooleanField(default=False) + can_pay_onsite = models.BooleanField(default=False) + cheque_details = models.TextField(blank=True, null=True) + bank_details = models.TextField(blank=True, null=True) + onsite_details = models.TextField(blank=True, null=True) + created_at = models.DateTimeField(null=True, blank=True) + is_sponsors_enabled = models.BooleanField(default=False, null=True, blank=True) + ical_url = models.URLField(blank=True, null=True) + pentabarf_url = models.URLField(blank=True, null=True) + xcal_url = models.URLField(blank=True, null=True) + has_owner_info = models.BooleanField(null=True, blank=True) + discount_code = models.ForeignKey(DiscountCode, on_delete=models.SET_NULL, null=True, blank=True) + refund_policy = models.TextField(blank=True, null=True) + is_stripe_linked = models.BooleanField(null=True, blank=True) + online = models.BooleanField(default=False) + is_donation_enabled = models.BooleanField(null=True, blank=True) + is_featured = models.BooleanField(default=False) + can_pay_by_omise = models.BooleanField(default=False) + is_ticket_form_enabled = models.BooleanField(default=True) + can_pay_by_alipay = models.BooleanField(default=False) + show_remaining_tickets = models.BooleanField(default=False) + is_billing_info_mandatory = models.BooleanField(default=False) + can_pay_by_paytm = models.BooleanField(default=False) + is_promoted = models.BooleanField(default=False) + is_demoted = models.BooleanField(default=False) + group = models.ForeignKey(Group, on_delete=models.SET_NULL, null=True, blank=True) + after_order_message = models.TextField(blank=True, null=True) + is_chat_enabled = models.BooleanField(default=False) + chat_room_id = models.CharField(max_length=255, blank=True, null=True) + document_links = models.JSONField(blank=True, null=True) + is_document_enabled = models.BooleanField(default=False) + is_videoroom_enabled = models.BooleanField(default=False) + is_oneclick_signup_enabled = models.BooleanField(default=False) + is_cfs_enabled = models.BooleanField(default=False) + is_announced = models.BooleanField(default=False) + completed_order_sales = models.IntegerField(null=True, blank=True) + placed_order_sales = models.IntegerField(null=True, blank=True) + pending_order_sales = models.IntegerField(null=True, blank=True) + completed_order_tickets = models.IntegerField(null=True, blank=True) + placed_order_tickets = models.IntegerField(null=True, blank=True) + pending_order_tickets = models.IntegerField(null=True, blank=True) + can_pay_by_invoice = models.BooleanField(default=False) + invoice_details = models.TextField(blank=True, null=True) + public_stream_link = models.URLField(blank=True, null=True) + stream_loop = models.BooleanField(null=True, blank=True) + stream_autoplay = models.BooleanField(null=True, blank=True) + is_badges_enabled = models.BooleanField(null=True, blank=True) diff --git a/events/tests.py b/events/tests.py new file mode 100644 index 0000000000..a39b155ac3 --- /dev/null +++ b/events/tests.py @@ -0,0 +1 @@ +# Create your tests here. diff --git a/events/views.py b/events/views.py new file mode 100644 index 0000000000..60f00ef0ef --- /dev/null +++ b/events/views.py @@ -0,0 +1 @@ +# Create your views here. diff --git a/groups/__init__.py b/groups/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/groups/admin.py b/groups/admin.py new file mode 100644 index 0000000000..846f6b4061 --- /dev/null +++ b/groups/admin.py @@ -0,0 +1 @@ +# Register your models here. diff --git a/groups/apps.py b/groups/apps.py new file mode 100644 index 0000000000..975f3e95c7 --- /dev/null +++ b/groups/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class GroupsConfig(AppConfig): + default_auto_field = "django.db.models.BigAutoField" + name = "groups" diff --git a/groups/migrations/0001_initial.py b/groups/migrations/0001_initial.py new file mode 100644 index 0000000000..9236d44340 --- /dev/null +++ b/groups/migrations/0001_initial.py @@ -0,0 +1,35 @@ +# Generated by Django 5.0 on 2024-03-12 03:59 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='Group', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('deleted_at', models.DateTimeField(blank=True, null=True)), + ('name', models.CharField(max_length=255)), + ('created_at', models.DateTimeField(auto_now_add=True, null=True)), + ('modified_at', models.DateTimeField(auto_now=True, null=True)), + ('social_links', models.JSONField(blank=True, null=True)), + ('about', models.TextField(blank=True, null=True)), + ('banner_url', models.URLField(blank=True, null=True)), + ('logo_url', models.URLField(blank=True, null=True)), + ('follower_count', models.IntegerField(default=0)), + ('thumbnail_image_url', models.URLField(blank=True, null=True)), + ('is_promoted', models.BooleanField(default=False)), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + ), + ] diff --git a/groups/migrations/__init__.py b/groups/migrations/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/groups/models.py b/groups/models.py new file mode 100644 index 0000000000..c11dd10855 --- /dev/null +++ b/groups/models.py @@ -0,0 +1,19 @@ +from django.db import models + +from users.models import CustomUser + + +# Create your models here. +class Group(models.Model): + deleted_at = models.DateTimeField(null=True, blank=True) + name = models.CharField(max_length=255) + user = models.ForeignKey(CustomUser, on_delete=models.CASCADE) + created_at = models.DateTimeField(auto_now_add=True, null=True, blank=True) + modified_at = models.DateTimeField(auto_now=True, null=True, blank=True) + social_links = models.JSONField(null=True, blank=True) + about = models.TextField(null=True, blank=True) + banner_url = models.URLField(null=True, blank=True) + logo_url = models.URLField(null=True, blank=True) + follower_count = models.IntegerField(default=0) + thumbnail_image_url = models.URLField(null=True, blank=True) + is_promoted = models.BooleanField(default=False) diff --git a/groups/tests.py b/groups/tests.py new file mode 100644 index 0000000000..a39b155ac3 --- /dev/null +++ b/groups/tests.py @@ -0,0 +1 @@ +# Create your tests here. diff --git a/groups/views.py b/groups/views.py new file mode 100644 index 0000000000..60f00ef0ef --- /dev/null +++ b/groups/views.py @@ -0,0 +1 @@ +# Create your views here. diff --git a/open_event_api/settings.py b/open_event_api/settings.py index c164044073..a570ae2585 100644 --- a/open_event_api/settings.py +++ b/open_event_api/settings.py @@ -54,6 +54,13 @@ "event_topics.apps.EventTopicsConfig", "notification_contents.apps.NotificationContentsConfig", "video_channels.apps.VideoChannelsConfig", + "discount_codes.apps.DiscountCodesConfig", + "event_sub_topics.apps.EventSubTopicsConfig", + "event_types.apps.EventTypesConfig", + "events.apps.EventsConfig", + "groups.apps.GroupsConfig", + "discount_code_tickets.apps.DiscountCodeTicketsConfig", + "tickets.apps.TicketsConfig", ] MIDDLEWARE = [ diff --git a/tickets/__init__.py b/tickets/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tickets/admin.py b/tickets/admin.py new file mode 100644 index 0000000000..846f6b4061 --- /dev/null +++ b/tickets/admin.py @@ -0,0 +1 @@ +# Register your models here. diff --git a/tickets/apps.py b/tickets/apps.py new file mode 100644 index 0000000000..0e6b40a8e6 --- /dev/null +++ b/tickets/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class TicketsConfig(AppConfig): + default_auto_field = "django.db.models.BigAutoField" + name = "tickets" diff --git a/tickets/migrations/0001_initial.py b/tickets/migrations/0001_initial.py new file mode 100644 index 0000000000..ed928e720f --- /dev/null +++ b/tickets/migrations/0001_initial.py @@ -0,0 +1,43 @@ +# Generated by Django 5.0 on 2024-03-12 03:59 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('events', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='Ticket', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=255)), + ('description', models.TextField(blank=True, null=True)), + ('is_description_visible', models.BooleanField(null=True)), + ('type', models.CharField(max_length=255)), + ('quantity', models.IntegerField(blank=True, null=True)), + ('price', models.FloatField(blank=True, null=True)), + ('sales_starts_at', models.DateTimeField()), + ('sales_ends_at', models.DateTimeField()), + ('is_hidden', models.BooleanField(null=True)), + ('min_order', models.IntegerField(blank=True, null=True)), + ('max_order', models.IntegerField(blank=True, null=True)), + ('is_fee_absorbed', models.BooleanField(null=True)), + ('position', models.IntegerField(blank=True, null=True)), + ('deleted_at', models.DateTimeField(blank=True, null=True)), + ('auto_checkin_enabled', models.BooleanField(null=True)), + ('is_checkin_restricted', models.BooleanField(null=True)), + ('max_price', models.FloatField(blank=True, null=True)), + ('min_price', models.FloatField(default=0)), + ('form_id', models.CharField(blank=True, max_length=255, null=True)), + ('badge_id', models.CharField(blank=True, max_length=255, null=True)), + ('event_id', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='events.event')), + ], + ), + ] diff --git a/tickets/migrations/__init__.py b/tickets/migrations/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tickets/models.py b/tickets/models.py new file mode 100644 index 0000000000..8eddf5f3f9 --- /dev/null +++ b/tickets/models.py @@ -0,0 +1,28 @@ +from django.db import models + +from events.models import Event + + +# Create your models here. +class Ticket(models.Model): + name = models.CharField(max_length=255) + description = models.TextField(null=True, blank=True) + is_description_visible = models.BooleanField(null=True) + type = models.CharField(max_length=255) + quantity = models.IntegerField(null=True, blank=True) + price = models.FloatField(null=True, blank=True) + sales_starts_at = models.DateTimeField() + sales_ends_at = models.DateTimeField() + is_hidden = models.BooleanField(null=True) + min_order = models.IntegerField(null=True, blank=True) + max_order = models.IntegerField(null=True, blank=True) + event_id = models.ForeignKey(Event, on_delete=models.SET_NULL, null=True, blank=True) + is_fee_absorbed = models.BooleanField(null=True) + position = models.IntegerField(null=True, blank=True) + deleted_at = models.DateTimeField(null=True, blank=True) + auto_checkin_enabled = models.BooleanField(null=True) + is_checkin_restricted = models.BooleanField(null=True) + max_price = models.FloatField(null=True, blank=True) + min_price = models.FloatField(default=0) + form_id = models.CharField(max_length=255, null=True, blank=True) + badge_id = models.CharField(max_length=255, null=True, blank=True) diff --git a/tickets/tests.py b/tickets/tests.py new file mode 100644 index 0000000000..a39b155ac3 --- /dev/null +++ b/tickets/tests.py @@ -0,0 +1 @@ +# Create your tests here. diff --git a/tickets/views.py b/tickets/views.py new file mode 100644 index 0000000000..60f00ef0ef --- /dev/null +++ b/tickets/views.py @@ -0,0 +1 @@ +# Create your views here.