diff --git a/accounts/api/views.py b/accounts/api/views.py index b8ebb56..f967265 100644 --- a/accounts/api/views.py +++ b/accounts/api/views.py @@ -985,6 +985,17 @@ class AccountTransferCheckView(APIView): print("request.user is ", request.user) try: obj = IAmPrincipalExtendedData.objects.get(principal=request.user) + except IAmPrincipalExtendedData.DoesNotExist: + # Create a dummy serializer record + obj = { + 'principal': request.user.id, + 'is_onboarded': False, + 'is_transferred': False, + 'transferred_on': None, + 'pwd_changed_post_transfer': False + } + return ApiResponse.success(message=constants.SUCCESS, data=obj) + except Exception as e: error_response = { "status": status.HTTP_404_NOT_FOUND, diff --git a/accounts/forms.py b/accounts/forms.py index fbc6897..a70b5f7 100644 --- a/accounts/forms.py +++ b/accounts/forms.py @@ -370,7 +370,7 @@ class CreateCustomerForm(forms.Form): widget=forms.widgets.SelectMultiple( attrs={"class": "form_select js-example-basic-multiple"} ), - required=False, + required=True, label='Preferences' ) free_start_date = forms.DateField( @@ -397,7 +397,7 @@ class UpdateCustomerForm(forms.Form): widget=forms.widgets.SelectMultiple( attrs={"class": "form_select js-example-basic-multiple"} ), - required=False, + required=True, label='Preferences' ) free_start_date = forms.DateField( diff --git a/accounts/views.py b/accounts/views.py index cce5f54..703c847 100644 --- a/accounts/views.py +++ b/accounts/views.py @@ -610,9 +610,16 @@ class CustomerCreateView(LoginRequiredMixin, generic.View): print(request.POST) # return redirect(self.success_url) form = self.form_class(request.POST) + context = self.get_context_data(form=form) if not form.is_valid(): - context = self.get_context_data(form=form) return render(request, self.template_name, context=context) + + free_subscription = Subscription.objects.filter(is_free=True, active=True).first() + + if not free_subscription: + messages.error(self.request, "Create a free subscription record for admin in manage subscription") + return render(request, self.template_name, context=context) + try: with transaction.atomic(): # save principal data @@ -647,7 +654,7 @@ class CustomerCreateView(LoginRequiredMixin, generic.View): principal=principal_obj, grace_period_end_date=PrincipalSubscription.generate_grace_period_end_date(form.cleaned_data.get("free_end_date")), is_paid=True, - subscription=Subscription.objects.filter(is_free=True, active=True).first() + subscription=free_subscription ) messages.success(self.request, constants.REGISTRATION_SUCCESS) @@ -968,6 +975,10 @@ class CustomerImportView(LoginRequiredMixin, generic.View): principal_type = IAmPrincipalType.objects.get(name=resource_action.PRINCIPAL_TYPE_EVENT_MANAGER) free_subscription = Subscription.objects.filter(is_free=True, active=True).first() + if not free_subscription: + messages.error(self.request, "Create a free subscription record for admin in manage subscription") + return render(request, self.template_name, context=context) + for idx, row in enumerate(ws.iter_rows(min_row=2, values_only=True), start=2): first_name, last_name, email, preferences, start_date, end_date = row print(f"{first_name}, {last_name, email, preferences, start_date, end_date}") diff --git a/manage_subscriptions/views.py b/manage_subscriptions/views.py index bf7dda6..959cd39 100644 --- a/manage_subscriptions/views.py +++ b/manage_subscriptions/views.py @@ -119,7 +119,7 @@ class SubscriptionView(LoginRequiredMixin, generic.ListView): context_object_name = "subscription_obj" def get_queryset(self): - queryset = super().get_queryset().filter(deleted=False, active=True) + queryset = super().get_queryset().filter(deleted=False, active=True).prefetch_related("principal_types") return queryset.order_by("-created_on") def get_context_data(self, **kwargs): diff --git a/requirements.txt b/requirements.txt index 3b5537f..37cd484 100644 --- a/requirements.txt +++ b/requirements.txt @@ -43,7 +43,9 @@ mysqlclient==2.2.4 numpy==1.26.4 oauthlib==3.2.2 onesignal-sdk==2.0.0 +openpyxl==3.1.4 orjson==3.9.15 +pandas==2.2.2 phonenumbers==8.13.30 pillow==10.2.0 pyasn1==0.5.1 @@ -67,7 +69,7 @@ sqlparse==0.4.4 stripe==8.2.0 tqdm==4.66.2 Twisted==23.10.0 -# twisted-iocpsupport==1.0.4 +twisted-iocpsupport==1.0.4 txaio==23.1.1 typing_extensions==4.9.0 tzdata==2024.1 diff --git a/templates/accounts/customer/customer_add.html b/templates/accounts/customer/customer_add.html index 723c9fb..4c30dc8 100644 --- a/templates/accounts/customer/customer_add.html +++ b/templates/accounts/customer/customer_add.html @@ -52,10 +52,6 @@ diff --git a/templates/accounts/customer/customer_edit.html b/templates/accounts/customer/customer_edit.html index 57c6774..7a45364 100644 --- a/templates/accounts/customer/customer_edit.html +++ b/templates/accounts/customer/customer_edit.html @@ -61,10 +61,6 @@ diff --git a/templates/manage_events/event_add.html b/templates/manage_events/event_add.html index 6321a39..950a41e 100644 --- a/templates/manage_events/event_add.html +++ b/templates/manage_events/event_add.html @@ -70,6 +70,7 @@ ); return FilePond.create(document.getElementById(selector),{ allowMultiple: allowMultiple, + acceptedFileTypes: ['image/*'], storeAsFile: true, dropOnPage: true }); @@ -198,6 +199,29 @@ // Handle principal change handlePrincipalChange(); + // Add custom validation method for greater than start date + $.validator.addMethod("greaterThanStartDate", function(value, element) { + var startDate = $('#id_free_start_date').val(); + if (!startDate || !value) { + return true; + } + return new Date(value) > new Date(startDate); + }, "The end date must be after the start date."); + + $.validator.addMethod("greaterThanFromTime", function(value, element){ + var startDateVal = $("#id_start_date").val(); + var endDateVal = $("#id_end_date").val(); + var fromTime = $("#id_from_time").val(); + var toTime = $(element).val(); + if (!toTime || !fromTime) { + return true; // Allow if either time is not selected (prevents errors) + } + if (startDateVal !== endDateVal) { + return true + } + return toTime > fromTime; + },"End time must be greater than start time on the same day") + // Initialize jQuery Validate $("#eventForm").validate({ rules: { @@ -215,25 +239,23 @@ }, image: { required: true, - accept: "image/*" }, event_images: { required: true, - accept: "image/*" }, start_date: { required: true, - date: true }, end_date: { required: true, - date: true + greaterThanStartDate: true }, from_time: { required: true }, to_time: { - required: true + required: true, + greaterThanFromTime: true }, category:{ required: true @@ -267,19 +289,15 @@ }, image: { required: "Please upload a thumbnail", - accept: "Please upload a valid image file" }, event_images: { required: "Please upload event images", - accept: "Please upload valid image files" }, start_date: { required: "Please select a start date", - date: "Please enter a valid date" }, end_date: { required: "Please select an end date", - date: "Please enter a valid date", greaterThanStartDate: "The end date must be after or equal to the start date." }, from_time: { @@ -302,30 +320,7 @@ required: "Please select a age group" }, tags: { - required: "Please enter tags" - } - }, - customMethods: { - greaterThanStartDate: function(element) { - var startDate = $("#id_start_date").datepicker("getDate"); // Assuming you're using datepicker - var endDate = $(element).datepicker("getDate"); - if (!endDate || !startDate) { - return true; // Allow if either date is not selected (prevents errors) - } - return endDate >= startDate; - }, - greaterThanFromTime: function(element){ - var startDateVal = $("#id_start_date").val(); - var endDateVal = $("#id_end_date").val(); - var fromTime = $("#id_from_time").val(); - var toTime = $(element).val(); - if (!toTime || !fromTime) { - return true; // Allow if either time is not selected (prevents errors) - } - if (startDateVal !== endDateVal) { - return true - } - return toTime > fromTime; + required: "Please enter tags" } }, errorElement: "div", @@ -344,7 +339,6 @@ $(element).addClass("is-valid").removeClass("is-invalid"); }, submitHandler: function(form) { - // Disable the submit button to prevent multiple submissions $('button[type="submit"]').prop('disabled', true); form.submit(); diff --git a/templates/manage_subscriptions/subscription_list.html b/templates/manage_subscriptions/subscription_list.html index 6e6896d..6a5a8b7 100644 --- a/templates/manage_subscriptions/subscription_list.html +++ b/templates/manage_subscriptions/subscription_list.html @@ -50,9 +50,9 @@ Amount - {% comment %} Customer Type {% endcomment %} + style="width: 69.2656px;"> Customer Type Free for Admin @@ -70,7 +70,15 @@ {{data_obj.title}} {{data_obj.plan.days}} {{data_obj.amount}} - {% comment %} {{data_obj.principal_types.name}} {% endcomment %} + + {% if data_obj.principal_types.all %} + {% for data in data_obj.principal_types.all %} + {{ data.name }} + {% endfor %} + {% else %} + No user type + {% endif %} + {{data_obj.is_free}} diff --git a/templates/manage_venues/venue_add.html b/templates/manage_venues/venue_add.html index 922cafe..d6c9c03 100644 --- a/templates/manage_venues/venue_add.html +++ b/templates/manage_venues/venue_add.html @@ -67,13 +67,29 @@ {% endblock %} \ No newline at end of file