project/scipycon/registration/views.py
changeset 310 3541adaa5cd3
parent 291 182b03a1e6fe
child 318 6963bc54d5c2
--- a/project/scipycon/registration/views.py	Mon Nov 29 21:15:51 2010 +0530
+++ b/project/scipycon/registration/views.py	Mon Nov 29 21:16:22 2010 +0530
@@ -1,3 +1,6 @@
+import datetime
+import time
+
 from django.contrib.auth import authenticate
 from django.contrib.auth import login
 from django.contrib.auth.decorators import login_required
@@ -344,35 +347,103 @@
         mail_subject = 'SciPy.in 2010: Confirmation of fee payment'
         mail_template = 'notifications/payment_confirmation2010.html'
 
-        for user_id_string in post_data:
-            id_str_list = user_id_string.split('_')
-            if (len(id_str_list) == 3 and id_str_list[0] == 'registrant' and
-              id_str_list[1] == 'id'):
-                id = int(id_str_list[2])
-                reg_user = User.objects.get(pk=id)
+        def parse_form():
+            """Helper function that gets the User ID from the
+            form name
+            """
+
+            confirmed_ids = []
+            acco_ids = []
+            date_ids = {}
+
+            for name_string in post_data:
+                id_str_list = name_string.split('_')
+                if (len(id_str_list) == 3 and id_str_list[1] == 'id'):
+                    if id_str_list[0] == 'confirmed':
+                        confirmed_ids.append(int(id_str_list[2]))
+                    if id_str_list[0] == 'acco':
+                        acco_ids.append(int(id_str_list[2]))
+                    if id_str_list[0] == 'date':
+                        date_str = post_data.get(name_string, None)
+                        if date_str:
+                            date_ids[int(id_str_list[2])] = post_data.get(
+                              name_string, '')
+
+            return confirmed_ids, acco_ids, date_ids
 
-                payment, created = reg_user.payment_set.get_or_create(
-                  user=reg_user, scope=scope_entity)
+        confirmed_ids, acco_ids, date_ids = parse_form()
+
+        confirmed_users = set(User.objects.filter(id__in=confirmed_ids))
+        acco_users = set(User.objects.filter(id__in=acco_ids))
+
+        # Users for whom both registration and accommodation is confirmed
+        for user in confirmed_users & acco_users:
+            payment, created = user.payment_set.get_or_create(
+              user=user, scope=scope_entity)
 
-                payment.confirmed = True
+            payment.confirmed = True
+            payment.acco_confirmed = True
+            payment.save()
+
+            if not payment.confirmed_mail and not payment.acco_confirmed_mail:
+                mail_message = loader.render_to_string(
+                  mail_template,
+                  dictionary={'name': user.get_full_name(),
+                            'acco': True,
+                            'reg': True})
+                user.email_user(mail_subject, mail_message,
+                                from_email='admin@scipy.in')
+                payment.confirmed_mail =True
+                payment.acco_confirmed_mail = True
                 payment.save()
 
-                mail_message = loader.render_to_string(
-                    mail_template,
-                    dictionary={'name': reg_user.get_full_name(),})
-                reg_user.email_user(mail_subject, mail_message,
-                                    from_email='admin@scipy.in')
-                list_user_ids.append(id)
+        # Users for whom only registration is confirmed
+        for user in confirmed_users - acco_users:
+            payment, created = user.payment_set.get_or_create(
+              user=user, scope=scope_entity)
+
+            payment.confirmed = True
+            payment.save()
 
-        # This is done to unset for the confirmation for users for whom
-        # mistakenly confirmation was set.
-        # (TODO) This is a very expensive operation, any better solution
-        # will be appreciated.
-        unpaid_users = User.objects.exclude(pk__in=list_user_ids)
-        for user in unpaid_users:
+            if not payment.confirmed_mail:
+                mail_message = loader.render_to_string(
+                  mail_template,
+                  dictionary={'name': user.get_full_name(),
+                          'reg': True})
+                user.email_user(mail_subject, mail_message,
+                                from_email='admin@scipy.in')
+                payment.confirmed_mail =True
+                payment.save()
+
+        # Users for whom only accommodation is confirmed
+        for user in acco_users - confirmed_users:
             payment, created = user.payment_set.get_or_create(
               user=user, scope=scope_entity)
-            payment.confirmed = False
+
+            payment.acco_confirmed = True
+            payment.save()
+
+            if not payment.acco_confirmed_mail:
+                mail_message = loader.render_to_string(
+                  mail_template,
+                  dictionary={'name': user.get_full_name(),
+                          'acco': True})
+                user.email_user(mail_subject, mail_message,
+                                from_email='admin@scipy.in')
+                payment.acco_confirmed_mail = True
+                payment.save()
+
+        # Users for whom fee payment date is updated
+        for id in date_ids:
+            user = User.objects.get(id=id)
+            payment, created = user.payment_set.get_or_create(
+              user=user, scope=scope_entity)
+
+            time_format = "%m/%d/%Y"
+            date = datetime.datetime.fromtimestamp(time.mktime(
+              time.strptime(date_ids[id], time_format)))
+
+            payment.date_confirmed = date
             payment.save()
 
     registrants = Registration.objects.all()