diff --git a/core/admin.py b/core/admin.py index 5c231e2..71419fd 100644 --- a/core/admin.py +++ b/core/admin.py @@ -57,6 +57,13 @@ class AssistantAdmin(admin.ModelAdmin): ] +def main_presenter(obj): + if presenters := obj.presenters.all(): + return presenters[0] + else: + return "no presenters" + + @admin.register(Talk) class TalkAdmin(admin.ModelAdmin): fieldsets = ( @@ -80,7 +87,7 @@ class TalkAdmin(admin.ModelAdmin): exclude = ['presenters'] date_hierarchy = 'start' actions_on_top = True - list_display = ('title', 'start', 'end', 'registered', 'capacity') + list_display = ('title', main_presenter, 'start', 'registered', 'capacity') search_fields = ['title'] show_full_result_count = True @@ -107,7 +114,7 @@ class WorkshopAdmin(admin.ModelAdmin): ] date_hierarchy = 'start' actions_on_top = True - list_display = ('title', 'start', 'end', 'registered', 'capacity') + list_display = ('title', main_presenter, 'start', 'registered', 'capacity') show_full_result_count = True search_fields = ['title'] diff --git a/core/models.py.save b/core/models.py.save deleted file mode 100644 index f0f3ccd..0000000 --- a/core/models.py.save +++ /dev/null @@ -1,219 +0,0 @@ -from django.db import models -from rest_framework.exceptions import ValidationError -from datetime import datetime -from GD.settings.base import AUTH_USER_MODEL - -IDPAY_STATUS = [ - (1, 'payment_not_made'), - (2,'payment_failed'), - (3,'error'), - (4,'blocked'), - (5,'return_to_payer'), - (6,'system_reversal'), - (7,'cancel_payment'), - (8,'moved_to_payment_gateway'), - (10,'awaiting_payment_verification'), - (100,'payment_is_approved'), - (101,'payment_is_approved'), - (200,'was_deposited'), - (201,'payment_created'), - (405,"error") - -] - -PAYMENT_STATES = [ - ('CM', 'COMPLETED'), - ('PN', 'PENDING'), - ('RJ', 'REJECTED') -] - -TEAM_STATE = [ - ('AC', 'ACTIVATED'), - ('RE', 'REQUESTED'), - ('RJ', 'REJECTED'), -] - -SERVICE_TYPE = [ - ('WS', 'WORKSHOP'), - ('TK', 'TALK'), -] - -LEVEL = [ - ('BG', 'BEGINNER'), - ('IM', 'INTERMEDIATE'), - ('EX', 'EXPERT') -] - -TEAM_MEMBER_ROLE = [ - ('HE', 'HEAD'), - ('ME', 'MEMBER'), - ('NO', 'NOTEAM') -] - - -class Presenter(models.Model): - first_name = models.CharField(max_length=30, blank=False) - last_name = models.CharField(max_length=30, blank=False) - email = models.EmailField(blank=True, null=True) - descriptions = models.TextField(null=True, blank=True) - linked_in = models.URLField(blank=True,null=True) - profile = models.ImageField( - verbose_name='presenter_profile', null=True, blank=True) - - class Meta: - unique_together = ('first_name', 'last_name') - - def __str__(self): - return f'{self.last_name} {self.first_name}' - - -class Talk(models.Model): - title = models.CharField(max_length=100, blank=False) - start = models.DateTimeField(blank=False, - end = models.DateTimeField(blank=False,default=datetime.now()) - content = models.TextField(blank=False) - capacity = models.IntegerField(blank=False) - participant_count = models.IntegerField(default=0) - presentation_link = models.URLField(blank=True) - level = models.CharField(choices=LEVEL, default='BG', max_length=2) - cost = models.FloatField(blank=False, default=0) - presenters = models.ManyToManyField(Presenter, related_name='talks') - - def clean(self): - if self.cost < 0: - raise ValidationError("cost cann't be a negative number.") - if self.start > self.end: - raise ValidationError("end of the service can not be before beginning") - - def get_total_services(self): - return self.services.count() - - def get_services(self): - return self.services.all() - - def get_remain_capacity(self): - registered_user = self.services.filter(payment_state='CM').count() - return self.capacity - int(registered_user) - - def __str__(self): - return self.title - - -class Workshop(models.Model): - title = models.CharField(max_length=100, blank=False) - #start = models.DateTimeField(blank=False ,default=datetime.now()) - #end = models.DateTimeField(blank=False , default=datetime.now()) - content = models.TextField(blank=False) - capacity = models.IntegerField(blank=False) - participant_count = models.IntegerField(default=0) - presentation_link = models.URLField(blank=True) - level = models.CharField(choices=LEVEL, default='BG', max_length=2) - cost = models.FloatField(blank=False, default=0) - presenters = models.ManyToManyField(Presenter, related_name='workshops') - - def clean(self): - if self.cost < 0: - raise ValidationError("cost cann't be a negative number.") - if self.start > self.end: - raise ValidationError("end of the service can not be before beginning") - - def get_total_services(self): - return self.services.count() - - def get_services(self): - return self.services.all() - - def get_remain_capacity(self): - registered_user = self.services.filter(payment_state='CM').count() - return self.capacity - int(registered_user) - - def __str__(self): - return self.title - - -class Payment(models.Model): - total_price = models.PositiveIntegerField() - status = models.IntegerField(choices=IDPAY_STATUS,default=201) - payment_id = models.CharField(null=True,max_length=42) - payment_link = models.TextField(null=True) - card_number = models.CharField(null=True,max_length=16) - hashed_card_number = models.TextField(null=True) - payment_trackID = models.CharField(null=True,max_length=20) - verify_trackID=models.CharField(null=True,max_length=20) - created_date = models.DateTimeField(null=True) - finished_date = models.DateTimeField(null=True) - verified_date = models.DateTimeField(null=True) - original_data = models.TextField(null=True) - user = models.ForeignKey( - AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='payments') - - def __str__(self): - return f"{self.pk}==>{self.user.user_name}=>{self.status}" - - -class EventService(models.Model): - payment_state = models.CharField( - max_length=2, - choices=PAYMENT_STATES, - default='PN' - ) - service_type = models.CharField( - max_length=2, - choices=SERVICE_TYPE, - blank=False - ) - - payment = models.ForeignKey( - Payment, null=True, blank=True, on_delete=models.SET_NULL, related_name='services') - - talk = models.ForeignKey( - Talk, blank=True, on_delete=models.CASCADE, related_name='services', null=True) - workshop = models.ForeignKey( - Workshop, blank=True, on_delete=models.CASCADE, related_name='services', null=True) - user = models.ForeignKey( - AUTH_USER_MODEL, on_delete=models.CASCADE, blank=True, related_name='services', null=True) - - def clean(self): - if self.service_type == 'WS': - if self.workshop == None or self.talk != None: - raise ValidationError( - 'service type must match with selected service!!!') - if self.service_type == 'TK': - if self.talk == None or self.workshop != None: - raise ValidationError( - 'service type must match with selected service!!!') - - def __str__(self): - return str(self.user.user_name) + '__' + str(self.service_type) + '__' + str(self.pk) - - -class Team(models.Model): - name = models.CharField(max_length=30, blank=False, - null=False, unique=True) - state = models.CharField( - max_length=2, - choices=TEAM_STATE, - default='RE' - ) - video = models.FileField(upload_to='videos', blank=True, null=True) - game = models.FileField(upload_to='games', blank=True, null=True) - like = models.PositiveIntegerField(default=0) - dislike = models.PositiveIntegerField(default=0) - profile = models.ImageField( - verbose_name='team_profile', null=True, blank=True) - team_activation = models.CharField(max_length=40, null=True, blank=True) - - def __str__(self): - return self.name - - -class CompetitionMember(models.Model): - user = models.OneToOneField( - AUTH_USER_MODEL, blank=False, unique=True, on_delete=models.CASCADE) - team = models.ForeignKey(Team, null=True, blank=True, - on_delete=models.SET_NULL, related_name='members') - has_team = models.BooleanField(default=False) - is_head = models.BooleanField(default=False) - - def __str__(self): - return self.user.user_name diff --git a/core/viewsets.py b/core/viewsets.py index 67d434a..3e1da60 100644 --- a/core/viewsets.py +++ b/core/viewsets.py @@ -146,6 +146,7 @@ def enroll(self, request, pk): ev_service = EventService.objects.create(**args) if obj.cost < 1: ev_service.payment_state = 'CM' + ev_service.save() return self.set_response( message=SUCCESSFULLY_ADDED, diff --git a/templates/activation_message.html b/templates/activation_message.html index 30c94ec..c01190a 100644 --- a/templates/activation_message.html +++ b/templates/activation_message.html @@ -21,7 +21,7 @@ style="background-color: #E8E7FF;text-align: center;padding: 20px 70px;width: fit-content;border-radius: 16px;margin: auto;margin-top: 56px;">

{{first_name|safe}} عزیز سلام!

- از اینکه در AUT GameCraft 2023 + از اینکه در AUT GameCraft 2024 (چهارمین دوره‌ی رویداد بازی‌سازی امیرکبیر) همراه ما هستی، بسیار خرسندیم.