Пример #1
0
 def test_waiting_list(self):
     self.invite = ActivityInvite(
         activity=self.activity,
         person=self.person
     )
     self.invite.save()
     self.assertFalse(WaitingList.objects.filter(pk=self.waitinglist_id).exists())
Пример #2
0
 def test_clean_age_limit_inbounds(self):
     self.person.birthday = datetime.now() - timedelta(days=365 * 6)
     self.activity.min_age = 4
     self.activity.max_age = 8
     self.invite = ActivityInvite(
         activity=self.activity,
         person=self.person
     )
     self.invite.clean()
Пример #3
0
 def test_clean_age_limit_max(self):
     self.person.birthday = datetime.now() - timedelta(days=365 * 10)
     self.activity.min_age = 4
     self.activity.max_age = 6
     self.invite = ActivityInvite(
         activity=self.activity,
         person=self.person
     )
     with self.assertRaises(ValidationError):
         self.invite.clean()
Пример #4
0
 def test_email_only_once(self):
     self.invite = ActivityInvite(
         activity=self.activity,
         person=self.person
     )
     self.invite.save()
     EmailSendCronJob().do()
     mail.outbox.clear()
     self.invite.save()
     EmailSendCronJob().do()
     self.assertEqual(len(mail.outbox), 0)
Пример #5
0
 def test_family_email(self):
     self.person.email = ''
     self.person.save()
     self.invite = ActivityInvite(
         activity=self.activity,
         person=self.person
     )
     self.invite.save()
     EmailSendCronJob().do()
     self.assertEqual(len(mail.outbox), 1)
     self.assertEqual(mail.outbox[0].to, ['*****@*****.**'])
Пример #6
0
 def test_own_email(self):
     self.person.email = '*****@*****.**'
     self.person.save()
     self.invite = ActivityInvite(
         activity=self.activity,
         person=self.person
     )
     self.invite.save()
     EmailSendCronJob().do()
     self.assertEqual(len(mail.outbox), 2)
     self.assertEqual(len(list(filter(lambda email: email.to == ['*****@*****.**'], mail.outbox))), 1, msg="No email was send to the persons email address")
     self.assertEqual(len(list(filter(lambda email: email.to == ['*****@*****.**'], mail.outbox))), 1, msg="No email wes send to the families email address")
Пример #7
0
    def invite_many_to_activity_action(self, request, queryset):
        # Get list of available departments
        if request.user.is_superuser or request.user.has_perm('members.view_all_persons'):
            deparment_list_query = Department.objects.all()
        else:
            deparment_list_query = Department.objects.filter(adminuserinformation__user=request.user)
        deparment_list = [('-', '-')]
        for department in deparment_list_query:
            deparment_list.append((department.id, department.name))

        # Get list of active and future activities
        department_ids = deparment_list_query.values_list('id', flat=True)
        activity_list_query = Activity.objects.filter(end_date__gt=timezone.now())
        if not request.user.is_superuser:
            activity_list_query = activity_list_query.filter(department__in=department_ids)
        activity_list = [('-', '-')]
        for activity in activity_list_query:
            activity_list.append((activity.id, activity.department.name + ", " + activity.name))

        # Form used to select department and activity - redundant department is for double check
        class MassInvitationForm(forms.Form):
            department = forms.ChoiceField(label='Afdeling', choices=deparment_list)
            activity = forms.ChoiceField(label='Aktivitet', choices=activity_list)
            expire = forms.DateField(label='Udløber', widget=AdminDateWidget(), initial=timezone.now() + timedelta(days=30 * 3))

        # Lookup all the selected persons - to show confirmation list
        persons = queryset

        context = admin.site.each_context(request)
        context['persons'] = persons
        context['queryset'] = queryset

        if request.method == 'POST' and 'department' in request.POST:
            # Post request with data
            mass_invitation_form = MassInvitationForm(request.POST)
            context['mass_invitation_form'] = mass_invitation_form

            if mass_invitation_form.is_valid() and mass_invitation_form.cleaned_data['activity'] != '-' and mass_invitation_form.cleaned_data['department'] != '-':
                activity = Activity.objects.get(pk=mass_invitation_form.cleaned_data['activity'])

                # validate activity belongs to user and matches selected department
                if int(mass_invitation_form.cleaned_data['department']) in department_ids:
                    if activity.department.id == int(mass_invitation_form.cleaned_data['department']):
                        invited_counter = 0

                        # get list of already created invitations on selected persons
                        already_invited = Person.objects.filter(activityinvite__activity=mass_invitation_form.cleaned_data['activity'], activityinvite__person__in=queryset).all()
                        list(already_invited)  # force lookup
                        already_invited_ids = already_invited.values_list('id', flat=True)

                        # only save if all succeeds
                        try:
                            with transaction.atomic():
                                for current_person in queryset:
                                    if(current_person.id not in already_invited_ids and (activity.max_age >= current_person.age_years() >= activity.min_age)):
                                        invited_counter = invited_counter + 1
                                        invitation = ActivityInvite(activity=activity, person=current_person, expire_dtm=mass_invitation_form.cleaned_data['expire'])
                                        invitation.save()
                        except Exception:
                            messages.error(request, "Fejl - ingen personer blev inviteret! Der var problemer med " + invitation.person.name + ". Vær sikker på personen ikke allerede er inviteret og opfylder alderskravet.")
                            return

                        # return ok message
                        already_invited_text = ""
                        if(already_invited.count()):
                            already_invited_text = ". Dog var : " + str.join(', ', already_invited.values_list('name', flat=True)) + " allerede inviteret!"
                        messages.success(request, str(invited_counter) + " af " + str(queryset.count()) + " valgte personer blev inviteret til " + str(activity) + already_invited_text)
                        return

                    else:
                        messages.error(request, "Valgt aktivitet stemmer ikke overens med valgt afdeling")
                        return
                else:
                    messages.error(request, "Du kan kun invitere til egne afdelinger")
                    return
        else:
            context['mass_invitation_form'] = MassInvitationForm()

        return render(request, 'admin/invite_many_to_activity.html', context)
Пример #8
0
    def invite_many_to_activity_action(self,request, queryset):
        # Get list of available departments
        if request.user.is_superuser or request.user.has_perm('members.view_all_persons'):
            deparment_list_query = Department.objects.all()
        else:
            deparment_list_query = Department.objects.filter(adminuserinformation__user=request.user)
        deparment_list=[('-', '-')]
        for department in deparment_list_query:
            deparment_list.append((department.id, department.name))

        # Get list of active and future activities
        department_ids = deparment_list_query.values_list('id', flat=True)
        activity_list_query = Activity.objects.filter(end_date__gt=timezone.now())
        if not request.user.is_superuser:
            activity_list_query = activity_list_query.filter(department__in=department_ids)
        activity_list=[('-', '-')]
        for activity in activity_list_query:
            activity_list.append((activity.id, activity.department.name + ", " + activity.name))

        # Form used to select department and activity - redundant department is for double check
        class MassInvitationForm(forms.Form):
            department = forms.ChoiceField(label='Afdeling', choices=deparment_list)
            activity = forms.ChoiceField(label='Aktivitet', choices=activity_list)
            expire = forms.DateField(label='Udløber', widget=AdminDateWidget(), initial=timezone.now() + timedelta(days=30*3))

        # Lookup all the selected persons - to show confirmation list
        persons = queryset

        context = admin.site.each_context(request)
        context['persons'] = persons
        context['queryset'] = queryset

        if request.method == 'POST' and 'department' in request.POST:
            # Post request with data
            mass_invitation_form = MassInvitationForm(request.POST)
            context['mass_invitation_form'] = mass_invitation_form

            if mass_invitation_form.is_valid() and mass_invitation_form.cleaned_data['activity'] != '-' and mass_invitation_form.cleaned_data['department'] != '-':
                activity = Activity.objects.get(pk=mass_invitation_form.cleaned_data['activity'])

                # validate activity belongs to user and matches selected department
                if int(mass_invitation_form.cleaned_data['department']) in department_ids:
                    if activity.department.id == int(mass_invitation_form.cleaned_data['department']):
                        invited_counter = 0

                        # get list of already created invitations on selected persons
                        already_invited = Person.objects.filter(activityinvite__activity=mass_invitation_form.cleaned_data['activity'], activityinvite__person__in=queryset).all()
                        list(already_invited) # force lookup
                        already_invited_ids = already_invited.values_list('id', flat=True)

                        # only save if all succeeds
                        try:
                            with transaction.atomic():
                                for current_person in queryset:
                                    if(current_person.id not in already_invited_ids):
                                        invited_counter = invited_counter + 1
                                        invitation = ActivityInvite(activity=activity, person=current_person, expire_dtm=mass_invitation_form.cleaned_data['expire'])
                                        invitation.save()
                        except Exception as e:
                            messages.error(request, "Fejl - ingen personer blev inviteret! Der var problemer med " + invitation.person.name +  ". Vær sikker på personen ikke allerede er inviteret og opfylder alderskravet.")
                            return

                        # return ok message
                        already_invited_text=""
                        if(already_invited.count()):
                            already_invited_text = ". Dog var : " + str.join(', ', already_invited.values_list('name', flat=True)) + " allerede inviteret!"
                        messages.success(request, str(invited_counter) + " af " + str(queryset.count()) + " valgte personer blev inviteret til " + str(activity) + already_invited_text)
                        return

                    else:
                        messages.error(request, "Valgt aktivitet stemmer ikke overens med valgt afdeling")
                        return
                else:
                    messages.error(request, "Du kan kun invitere til egne afdelinger")
                    return
        else:
            context['mass_invitation_form'] = MassInvitationForm()

        return render(request, 'admin/invite_many_to_activity.html', context)
Пример #9
0
class TestModelActivityInvite(TestCase):
    fixtures = ['templates']

    def setUp(self):
        self.union = Union()
        self.union.save()

        self.department = Department(
            union=self.union
        )
        self.department.save()

        self.activity = Activity(
            start_date=datetime.now(),
            end_date=datetime.now() + timedelta(days=365),  # Has to be long enough to be a season
            department=self.department
        )
        self.activity.save()
        self.assertTrue(self.activity.is_season())  # If this fail increase the end_date

        self.family = Family(
            email='*****@*****.**'
        )
        self.family.save()

        self.person = Person(
            family=self.family
        )
        self.person.save()

        waitinglist = WaitingList(
            person=self.person,
            department=self.department,
            on_waiting_list_since=datetime.now() - timedelta(days=1)
        )
        waitinglist.save()
        self.waitinglist_id = waitinglist.id

        self.emailtemplate = EmailTemplate(
            idname='ACT_INVITE',
            from_address='*****@*****.**'
        )
        self.emailtemplate.save()

    def test_own_email(self):
        self.person.email = '*****@*****.**'
        self.person.save()
        self.invite = ActivityInvite(
            activity=self.activity,
            person=self.person
        )
        self.invite.save()
        EmailSendCronJob().do()
        self.assertEqual(len(mail.outbox), 2)
        self.assertEqual(len(list(filter(lambda email: email.to == ['*****@*****.**'], mail.outbox))), 1, msg="No email was send to the persons email address")
        self.assertEqual(len(list(filter(lambda email: email.to == ['*****@*****.**'], mail.outbox))), 1, msg="No email wes send to the families email address")

    def test_family_email(self):
        self.person.email = ''
        self.person.save()
        self.invite = ActivityInvite(
            activity=self.activity,
            person=self.person
        )
        self.invite.save()
        EmailSendCronJob().do()
        self.assertEqual(len(mail.outbox), 1)
        self.assertEqual(mail.outbox[0].to, ['*****@*****.**'])

    def test_email_only_once(self):
        self.invite = ActivityInvite(
            activity=self.activity,
            person=self.person
        )
        self.invite.save()
        EmailSendCronJob().do()
        mail.outbox.clear()
        self.invite.save()
        EmailSendCronJob().do()
        self.assertEqual(len(mail.outbox), 0)

    def test_waiting_list(self):
        self.invite = ActivityInvite(
            activity=self.activity,
            person=self.person
        )
        self.invite.save()
        self.assertFalse(WaitingList.objects.filter(pk=self.waitinglist_id).exists())

    def test_clean_age_limit_min(self):
        self.person.birthday = datetime.now() - timedelta(days=365 * 2)
        self.activity.min_age = 4
        self.activity.max_age = 8
        self.invite = ActivityInvite(
            activity=self.activity,
            person=self.person
        )
        with self.assertRaises(ValidationError):
            self.invite.clean()

    def test_clean_age_limit_max(self):
        self.person.birthday = datetime.now() - timedelta(days=365 * 10)
        self.activity.min_age = 4
        self.activity.max_age = 6
        self.invite = ActivityInvite(
            activity=self.activity,
            person=self.person
        )
        with self.assertRaises(ValidationError):
            self.invite.clean()

    def test_clean_age_limit_inbounds(self):
        self.person.birthday = datetime.now() - timedelta(days=365 * 6)
        self.activity.min_age = 4
        self.activity.max_age = 8
        self.invite = ActivityInvite(
            activity=self.activity,
            person=self.person
        )
        self.invite.clean()