From ee666d0ff0fe0461ae653283368e1a160d2905e4 Mon Sep 17 00:00:00 2001 From: ankitamk14 Date: Wed, 15 May 2024 18:24:18 +0530 Subject: [PATCH 1/3] modified event creation form --- training/admin.py | 6 ++- training/models.py | 17 +++++++- training/templates/create_event.html | 58 ++++++++++++++++++++++++---- 3 files changed, 72 insertions(+), 9 deletions(-) diff --git a/training/admin.py b/training/admin.py index 455c4a5f4..714cc58dd 100755 --- a/training/admin.py +++ b/training/admin.py @@ -1,6 +1,10 @@ from django.contrib import admin # Register your models here. -from .models import ILWFossMdlCourses +from .models import ILWFossMdlCourses, Company + +class CompanyAdmin(admin.ModelAdmin): + pass admin.site.register(ILWFossMdlCourses) +admin.site.register(Company, CompanyAdmin) diff --git a/training/models.py b/training/models.py index f7dc2d35d..3cb791636 100755 --- a/training/models.py +++ b/training/models.py @@ -12,7 +12,7 @@ EVENT_TYPE_CHOICES =( ('', '-----'), ('FDP', 'Paid FDP'), ('Workshop', 'Blended Mode Workshop'),('sdp', 'Student Training Programme'),('TPDP', 'Teachers Professional Development Program' -), ('SSDP', 'School Students Development Program') +), ('SSDP', 'School Students Development Program'), ('PDP', 'Professional Development Program'), ('CDP', 'Community Development Program'), ) @@ -20,6 +20,19 @@ ('', '-----'), (1, 'Subscribed College'),(2, 'Manual Registration') ) +class Company(models.Model): + name = models.CharField(max_length=250) + added_by = models.ForeignKey(User, on_delete=models.PROTECT) + created = models.DateTimeField(auto_now_add=True) + updated = models.DateTimeField(auto_now=True) + + class Meta: + verbose_name_plural = "Companies" + ordering = ['name'] + + def __str__(self): + return self.name + class TrainingEvents(models.Model): event_type = models.CharField(max_length = 50, choices = EVENT_TYPE_CHOICES) @@ -39,6 +52,8 @@ class TrainingEvents(models.Model): training_status = models.PositiveSmallIntegerField(default=0) entry_date = models.DateTimeField(auto_now_add = True) entry_user = models.ForeignKey(User, on_delete=models.PROTECT) + company = models.ForeignKey(Company, on_delete=models.PROTECT, null=True, blank=True) + city = models.ForeignKey(City, on_delete=models.PROTECT, null=True, blank=True) def __str__(self): diff --git a/training/templates/create_event.html b/training/templates/create_event.html index 274d528ae..d14a23e3b 100644 --- a/training/templates/create_event.html +++ b/training/templates/create_event.html @@ -46,7 +46,15 @@ -
+
+ +
+ {% render_field form.city class+="form-control city" %} + {{ form.state.errors }} +
+
+ +
{% render_field form.host_college class+="form-control host_college" %} @@ -54,6 +62,14 @@
+
+ +
+ {% render_field form.company class+="form-control company" %} + {{ form.company.errors }} +
+
+
@@ -128,16 +144,26 @@
- {% endblock %} +{% endblock %} + {% block jsblock %} + {% endblock %} \ No newline at end of file From 9e2e85b6fb7cceb3613350a6e0cbaca1766440b4 Mon Sep 17 00:00:00 2001 From: ankitamk14 Date: Thu, 16 May 2024 11:08:22 +0530 Subject: [PATCH 2/3] added pdp & cdp programs --- donate/views.py | 56 +- events/filters.py | 2 +- training/forms.py | 14 +- .../migrations/0012_auto_20240515_1424.py | 48 ++ .../migrations/0013_auto_20240516_0017.py | 27 + training/models.py | 2 + training/templates/register_user.html | 697 ++++++++++-------- training/views.py | 48 +- 8 files changed, 559 insertions(+), 335 deletions(-) create mode 100644 training/migrations/0012_auto_20240515_1424.py create mode 100644 training/migrations/0013_auto_20240516_0017.py diff --git a/donate/views.py b/donate/views.py index 690de060c..9393a0bf6 100644 --- a/donate/views.py +++ b/donate/views.py @@ -108,32 +108,39 @@ def pay_now(request, purpose): data = get_final_data(request, obj, purpose) else: messages.errors(request,'Invalid Form') + print(f"\033[93m pay_now \033[0m") return render(request, 'payment_status.html', data) @csrf_exempt def form_valid(request, form, purpose): """ - If the form is valid, save the associated model. + This method saves the Payee & CdFossLanguages records. + Payee record is used to store payment information. + CdFossLanguages record stores mapping of user and foss which the user is eligible to download. """ + print(f"\033[92m Form is valid \033[0m") + # Save Payee record form_data = form.save(commit=False) - form_data.reqId = CHANNEL_ID+str(display.value(datetime.now().strftime('%Y%m%d%H%M%S'))[0:20]) + # form_data.reqId = CHANNEL_ID+str(display.value(datetime.now().strftime('%Y%m%d%H%M%S'))[0:20]) + form_data.reqId = "abc" form_data.user = request.user form_data.status = 0 form_data.expiry = calculate_expiry() form_data.purpose = purpose form_data.save() payee_obj = form_data + print(f"\033[97m Form data is saved \033[0m") + # Save CdFossLanguages record + # foss_ids = form.cleaned_data.get('foss_id') + # languages = form.cleaned_data.get('language_id') + # level_ids = form.cleaned_data.get('level_id') + fosses = form.cleaned_data.get('foss_id').split(',') + foss_languages = form.cleaned_data.get('language_id').split(',|') + levels = form.cleaned_data.get('level_id').split(',') - foss_ids = form.cleaned_data.get('foss_id') - languages = form.cleaned_data.get('language_id') - level_ids = form.cleaned_data.get('level_id') - fosses = foss_ids.split(',') - foss_languages = languages.split(',|') - levels = level_ids.split(',') - - payee_id = payee_obj.pk + # payee_id = payee_obj.pk foss_level = 0 - + for i in range(len(fosses)): foss_category = FossCategory.objects.get(pk=int(fosses[i])) if int(levels[i]): @@ -150,7 +157,7 @@ def form_valid(request, form, purpose): if language not in ('','None'): foss_language = Language.objects.get(pk=int(language)) cd_foss_langs = CdFossLanguages() - cd_foss_langs.payment = Payee.objects.get(pk=payee_id) + cd_foss_langs.payment = Payee.objects.get(pk=payee_obj.pk) cd_foss_langs.foss = foss_category cd_foss_langs.lang = foss_language if foss_level: @@ -165,24 +172,31 @@ def form_invalid(request, form): If the form is invalid, re-render the context data with the data-filled form and errors. """ + messages.warning(request, 'Invalid form payment request.') return redirect('cdcontent:cdcontenthome') @csrf_exempt def controller(request, purpose): + print(f"\033[92m 1 Inside controller of initiate_payment \033[0m") + print(f"\033[92m purpose : {purpose} \033[0m") form = PayeeForm(request.POST) if request.method == 'POST': if form.is_valid(): + # form_valid function creates Payee & CdFossLanguages records. + # & returns Payee record payee_obj_new = form_valid(request, form, purpose) + print(f"\033[95m FORM IS VALID \033[0m") else: form_invalid(request, form) - if purpose != 'cdcontent': - participant_form = reg_success(request, 'general') + + if purpose != 'cdcontent': # purpose = event_id in case of ILW + participant_form = reg_success(request, 'general') participant_form.payment_status = payee_obj_new try : participant_form.save() - except : + except Exception as e: return redirect('training:list_events', status='myevents') data = get_final_data(request, payee_obj_new, purpose) return render(request, 'payment_status.html', data) @@ -202,6 +216,7 @@ def encrypted_data(request, obj, purpose): request_id = obj.reqId STdata = request_id + str(request.user.id) + str(user_name) + str(amount) + purpose + CHANNEL_ID + CHANNEL_KEY s = display.value(str(STdata)) + print(f"\033[92m Encrypted Data : {s} \033[0m") return s @@ -317,6 +332,17 @@ def validate(request): context["validate"] = "fail" return HttpResponse(json.dumps(context), content_type='application/json') +# import requests +# def temp(request): +# template_name = 'reg_success.html' +# name = request.POST.get('name') +# email = request.POST.get('email') +# phone = request.POST.get('phone') +# event_obj = request.POST.get('event') +# context = { +# name = '' +# } +# return render(request, template_name, context) def receipt(request): response = HttpResponse(content_type='application/pdf') diff --git a/events/filters.py b/events/filters.py index eab832022..63e8115fd 100644 --- a/events/filters.py +++ b/events/filters.py @@ -336,7 +336,7 @@ class ViewEventFilter(django_filters.FilterSet): event_start_date = django_filters.DateFromToRangeFilter() event_end_date = django_filters.DateFromToRangeFilter() event_type = django_filters.ChoiceFilter(choices=[('FDP', 'Paid FDP'), ('Workshop', 'Blended Mode Workshop'),('sdp', 'Student Training Programme'),('TPDP', 'Teachers Professional Development Program' -), ('SSDP', 'School Students Development Program')]) +), ('SSDP', 'School Students Development Program'), ('PDP', 'Professional Development Program'), ('CDP', 'Community Development Program'),]) def __init__(self, *args, **kwargs): diff --git a/training/forms.py b/training/forms.py index 9be4f2560..47bfe95bd 100644 --- a/training/forms.py +++ b/training/forms.py @@ -33,6 +33,18 @@ class RegisterUser(forms.ModelForm): required = False, error_messages = {'required': 'component type is required.'}, ) + # company = forms.ModelChoiceField( + # widget = forms.Select(attrs = {'class' : 'ac-state'}), + # queryset = Company.objects.order_by('name'), + # empty_label = "--- Select Company ---", + # help_text = "" + # ) + # city = forms.ModelChoiceField( + # widget = forms.Select(attrs = {'class' : 'ac-city'}), + # queryset = City.objects.order_by('name'), + # empty_label = "--- Select City ---", + # help_text = "" + # ) foss_language = forms.ModelChoiceField( queryset = Language.objects.order_by('name'), required = False, @@ -41,7 +53,7 @@ class RegisterUser(forms.ModelForm): phone = forms.RegexField(regex=r'^\+?1?\d{8,15}$', error_messages = {'required': 'Enter valid phone number.'},) class Meta(object): model = Participant - fields = ['name', 'email', 'state', 'gender', 'amount', 'foss_language'] + fields = ['name', 'email', 'state', 'gender', 'amount', 'foss_language', 'company', 'city'] def __init__(self, *args, **kwargs): super(RegisterUser, self).__init__(*args, **kwargs) diff --git a/training/migrations/0012_auto_20240515_1424.py b/training/migrations/0012_auto_20240515_1424.py new file mode 100644 index 000000000..bce7cb01d --- /dev/null +++ b/training/migrations/0012_auto_20240515_1424.py @@ -0,0 +1,48 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11 on 2024-05-15 08:54 +from __future__ import unicode_literals + +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), + ('events', '0047_testattendance_mdlgrade'), + ('training', '0011_auto_20230127_1859'), + ] + + operations = [ + migrations.CreateModel( + name='Company', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=250)), + ('created', models.DateTimeField(auto_now_add=True)), + ('updated', models.DateTimeField(auto_now=True)), + ('added_by', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL)), + ], + options={ + 'verbose_name_plural': 'Companies', + 'ordering': ['name'], + }, + ), + migrations.AddField( + model_name='trainingevents', + name='city', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='events.City'), + ), + migrations.AlterField( + model_name='trainingevents', + name='event_type', + field=models.CharField(choices=[('', '-----'), ('FDP', 'Paid FDP'), ('Workshop', 'Blended Mode Workshop'), ('sdp', 'Student Training Programme'), ('TPDP', 'Teachers Professional Development Program'), ('SSDP', 'School Students Development Program'), ('PDP', 'Professional Development Program'), ('CDP', 'Community Development Program')], max_length=50), + ), + migrations.AddField( + model_name='trainingevents', + name='company', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='training.Company'), + ), + ] diff --git a/training/migrations/0013_auto_20240516_0017.py b/training/migrations/0013_auto_20240516_0017.py new file mode 100644 index 000000000..00db5a1d3 --- /dev/null +++ b/training/migrations/0013_auto_20240516_0017.py @@ -0,0 +1,27 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11 on 2024-05-15 18:47 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('events', '0047_testattendance_mdlgrade'), + ('training', '0012_auto_20240515_1424'), + ] + + operations = [ + migrations.AddField( + model_name='participant', + name='city', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='events.City'), + ), + migrations.AddField( + model_name='participant', + name='company', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='training.Company'), + ), + ] diff --git a/training/models.py b/training/models.py index 3cb791636..feb1c6da1 100755 --- a/training/models.py +++ b/training/models.py @@ -75,6 +75,8 @@ class Participant(models.Model): foss_language = models.ForeignKey(Language, on_delete=models.PROTECT, null=True ) payment_status = models.ForeignKey(Payee, on_delete=models.PROTECT, null=True) reg_approval_status = models.PositiveSmallIntegerField(default=0) + company = models.ForeignKey(Company, on_delete=models.PROTECT, null=True, blank=True) + city = models.ForeignKey(City, on_delete=models.PROTECT, null=True, blank=True) class Meta(object): unique_together = ('event', 'user', 'payment_status') diff --git a/training/templates/register_user.html b/training/templates/register_user.html index 71b3a50d5..e92fcaff0 100644 --- a/training/templates/register_user.html +++ b/training/templates/register_user.html @@ -27,245 +27,290 @@

Welcome
-
+
-{% csrf_token %} -
-
- - - - + {% csrf_token %} +
+
+ + + + +
+ +
+ {% render_field form.name class+="form-control name" %} + {{ form.name.errors }} +
+
- +
- {% render_field form.name class+="form-control name" tabindex="1" %} - {{ form.name.errors }} + {% render_field form.email class+="form-control email" %} + {{ form.email.errors }} + +
+ +
+ +
- +
- {% render_field form.email class+="form-control email" tabindex="2" %} - {{ form.email.errors }} - -
- -
+ {% render_field form.phone class+="form-control phone" %} + {{ form.phone.errors }} + (Please provide a valid phone number. It will help us to contact you for any updates.)
-
- -
- {% render_field form.phone class+="form-control phone" tabindex="1" %} - {{ form.phone.errors }} - (Please provide a valid phone number. It will help us to contact you for any updates.) -
- -
- - +
-
-
- {% if user|is_user_paid %} - - - - {% else %} - - - - {% endif %} -
-
- + + + +
+ +
+
{{event_obj.foss}}
+
+
+ {% if langs %} +
+ +
+ {% render_field form.foss_language class+="form-control foss_language" %} + {{ form.name.errors }} + Select Language of Tutorial Instructions +
English language will be offered by default in CD-content. +
In addition, you can choose any other language also. +
+ + +
+ +
+ {% endif %} + {% if user|is_user_paid %} +
+
+
+ {% if user|is_user_paid %} + + + + {% else %} + + + + {% endif %}
-
-
NEFT Payment Information
-
- Click here for Payment Flow via NEFT. -

You can pay by NEFT and contact your state Training Manager for registration

- -
+
+ +
+
+
+
Important Dates
+ + + + + + + + + + + +
Registration{{ event_obj.registartion_start_date|format_date:event_obj.registartion_end_date }} +
Event{{ event_obj.event_start_date|format_date:event_obj.event_end_date }} +
+
+
+
Event Organiser
+ + + + + + + + + + + + + + + +
+ {% if event_obj.event_type == "PDP"%} + {{event_obj.company.name}}
+ {% else %} + {{event_obj.host_college}}
+ {% endif %} + {{event_obj.state.name}} +
{{event_obj.event_coordinator_name}}
{{event_obj.event_coordinator_email}}
{{event_obj.event_coordinator_contact_no}}
+
+
+
NEFT Payment Information
+
+ Click here for Payment Flow via NEFT. +

You can pay by NEFT and contact your state Training Manager for registration

+
+
-
-
For any queries kindly contact our State Training Managers
-
- Click here for Contact Details - -
+
+
For any queries kindly contact our State Training Managers
+
+ Click here for Contact Details +
-
- -
-
+
+
+ +
+

@@ -273,13 +318,80 @@

Welcome {%endblock%} {% block jsblock %} + + {% endblock %} diff --git a/training/views.py b/training/views.py index b12bf7e2f..8d86c953d 100644 --- a/training/views.py +++ b/training/views.py @@ -11,6 +11,7 @@ from django.db.models import Q from django.contrib.auth.models import User from django.urls import reverse +from django.db import IntegrityError # Python imports from datetime import datetime,date import csv @@ -60,7 +61,10 @@ class TrainingEventCreateView(CreateView): @method_decorator(group_required("Resource Person")) def get(self, request, *args, **kwargs): - return render(self.request, self.template_name, {'form': self.form_class()}) + context = {'form': self.form_class()} + context['pdp_fee']=settings.PDP_FEE + context['cdp_fee']=settings.CDP_FEE + return render(self.request, self.template_name, context) def form_valid(self, form, **kwargs): self.object = form.save(commit=False) @@ -90,7 +94,7 @@ def dispatch(self, *args, **kwargs): if self.status == 'completed': self.events = TrainingEvents.objects.filter(event_end_date__lt=today).order_by('-event_end_date') if self.status == 'ongoing': - self.events = TrainingEvents.objects.filter(event_end_date__gte=today) + self.events = TrainingEvents.objects.filter(event_end_date__gte=today).order_by('registartion_end_date') if self.status == 'myevents': participant = Participant.objects.filter( Q(payment_status__status=1)|Q(registartion_type__in=(1,3)), @@ -170,16 +174,40 @@ def reg_success(request, user_type): email = request.POST.get('email') phone = request.POST.get('phone') event_obj = request.POST.get('event') + city = request.POST.get('city') + company = request.POST.get('company') + new_company = request.POST.get('new_company') event = TrainingEvents.objects.get(id=event_obj) + form = RegisterUser(request.POST) + + event_type = request.POST.get('event_type', '') + print(f"\033[92m event_type : {event_type} \033[0m") + print(f"\033[93m {request.POST} \033[0m") if form.is_valid(): form_data = form.save(commit=False) form_data.user = request.user form_data.event = event - try: - form_data.college = AcademicCenter.objects.get(institution_name=request.POST.get('college')) - except: - form_data.college = AcademicCenter.objects.get(id=request.POST.get('dropdown_college')) + if not event_type in ['PDP', 'CDP']: + try: + form_data.college = AcademicCenter.objects.get(institution_name=request.POST.get('college')) + except: + form_data.college = AcademicCenter.objects.get(id=request.POST.get('dropdown_college')) + else: + city_obj = City.objects.get(id=city) + form_data.city = city_obj + print(f"\033[94m city : {city_obj} \033[0m") + form_data.college = AcademicCenter.objects.get(id=request.POST.get('college')) + if company: + comp_obj = Company.objects.get(id=company) + print(f"\033[94m company : {comp_obj} \033[0m") + form_data.company = comp_obj + else: + try: + company=Company.objects.create(name=new_company, added_by=request.user) + form_data.company = company + except IntegrityError: + pass user_data = is_user_paid(request.user, form_data.college.id) if user_data[0]: form_data.registartion_type = 1 #Subscribed College @@ -194,19 +222,23 @@ def reg_success(request, user_type): messages.success(request, "You have already registered for this event.") return redirect('training:list_events', status='myevents') else : - + print(f"\033[92m Saving form \033[0m") + print(f"{form_data}") form_data.save() event_name = event.event_name userprofile = Profile.objects.get(user=request.user) userprofile.phone = phone userprofile.save() if user_type == 'paid': + # if user is already a paid user -> render reg_success.html showing registration success context = {'participant_obj':form_data} return render(request, template_name, context) else: + # if user has made payment from ILW interface -> return Participant form return form_data else: - messages.warning(request, 'Invalid form payment request.') + print(f"\033[91m {form.errors} \033[0m") + messages.warning(request, 'Invalid form payment request 1.') return redirect('training:list_events', status='ongoing' ) From 526c3fa399a5473decd46405a7b04b34051a5134 Mon Sep 17 00:00:00 2001 From: ankitamk14 Date: Thu, 16 May 2024 16:13:03 +0530 Subject: [PATCH 3/3] Temporary commented out for testing --- events/templates/payment_status.html | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/events/templates/payment_status.html b/events/templates/payment_status.html index 87c557579..6e4e50e38 100644 --- a/events/templates/payment_status.html +++ b/events/templates/payment_status.html @@ -58,9 +58,13 @@

{% block jsblock %} {% endblock %}