Пример #1
0
def send_bulk_email(
    request: HttpRequest,
    action_class: Type[BaseAction],
    triggers: QuerySet[Trigger],
    emails: List[str],
    additional_context_objects: Mapping[Any, Any],
    object_: Any,
):
    emails_to_send = [
        emails[i : i + settings.BULK_EMAIL_LIMIT]  # noqa
        for i in range(0, len(emails), settings.BULK_EMAIL_LIMIT)
    ]
    for emails in emails_to_send:
        jobs, rqjobs = ActionManageMixin.add(
            action_class=action_class,
            logger=logger,
            scheduler=scheduler,
            triggers=triggers,
            context_objects=dict(
                person_emails=emails,
                **additional_context_objects,
            ),
            object_=object_,
        )
        if triggers and jobs:
            ActionManageMixin.bulk_schedule_message(
                request=request,
                num_emails=len(emails),
                trigger=triggers[0],
                job=jobs[0],
                scheduler=scheduler,
            )
Пример #2
0
    def form_valid(self, form):
        self.object = form.save()

        event = self.object
        wr = self.other_object

        person = wr.host()
        if person:
            Task.objects.create(event=event,
                                person=person,
                                role=Role.objects.get(name="host"))

        if PostWorkshopAction.check(event):
            objs = dict(event=event, request=wr)
            jobs, rqjobs = ActionManageMixin.add(
                action_class=PostWorkshopAction,
                logger=logger,
                scheduler=scheduler,
                triggers=Trigger.objects.filter(
                    active=True,
                    action="week-after-workshop-completion",
                ),
                context_objects=objs,
                object_=event,
                request=self.request,
            )

        wr.state = "a"
        wr.event = event
        wr.save()
        return super().form_valid(form)
Пример #3
0
 def __call__(self, *args, **kwargs):
     people = self.get_people_with_anniversary()
     triggers = Trigger.objects.filter(
         active=True,
         action="profile-update",
     )
     for person in people:
         ActionManageMixin.add(
             action_class=self.EMAIL_ACTION_CLASS,
             logger=logger,
             scheduler=scheduler,
             triggers=triggers,
             context_objects={
                 "person_email": person.email,
                 "person_full_name": person.full_name,
             },
             object_=person,
         )
Пример #4
0
def create_uploaded_persons_tasks(data, request=None):
    """
    Create persons and tasks from upload data.
    """

    # Quick sanity check.
    if any([row.get("errors") for row in data]):
        raise InternalError("Uploaded data contains errors, cancelling upload")

    persons_created = []
    tasks_created = []
    events = set()

    with transaction.atomic():
        for row in data:
            try:
                row_repr = ("{personal} {family} {username} <{email}>, "
                            "{role} at {event}").format(**row)

                fields = {key: row[key] for key in Person.PERSON_UPLOAD_FIELDS}
                fields["username"] = row["username"]

                if row["person_exists"] and row["existing_person_id"]:
                    # we should use existing Person
                    p = Person.objects.get(pk=row["existing_person_id"])

                elif row["person_exists"] and not row["existing_person_id"]:
                    # we should use existing Person
                    p = Person.objects.get(
                        personal=fields["personal"],
                        family=fields["family"],
                        username=fields["username"],
                        email=fields["email"],
                    )

                else:
                    # we should create a new Person without any email provided
                    p = Person(**fields)
                    p.save()
                    persons_created.append(p)

                if row["event"] and row["role"]:
                    e = Event.objects.get(slug=row["event"])
                    r = Role.objects.get(name=row["role"])

                    # if the number of learners attending the event changed,
                    # we should update ``event.attendance``
                    if row["role"] == "learner":
                        events.add(e)

                    t, created = Task.objects.get_or_create(person=p,
                                                            event=e,
                                                            role=r)
                    if created:
                        tasks_created.append(t)

            except IntegrityError as e:
                raise IntegrityError('{0} (for "{1}")'.format(
                    str(e), row_repr))

            except ObjectDoesNotExist as e:
                raise ObjectDoesNotExist('{0} (for "{1}")'.format(
                    str(e), row_repr))

    jobs_created = []
    rqjobs_created = []

    # for each created task, try to add a new-(supporting)-instructor action
    with transaction.atomic():
        for task in tasks_created:
            # conditions check out
            if NewInstructorAction.check(task):
                objs = dict(task=task, event=task.event)
                # prepare context and everything and create corresponding RQJob
                jobs, rqjobs = ActionManageMixin.add(
                    action_class=NewInstructorAction,
                    logger=logger,
                    scheduler=scheduler,
                    triggers=Trigger.objects.filter(active=True,
                                                    action="new-instructor"),
                    context_objects=objs,
                    object_=task,
                    request=request,
                )
                jobs_created += jobs
                rqjobs_created += rqjobs

            # conditions check out
            if NewSupportingInstructorAction.check(task):
                objs = dict(task=task, event=task.event)
                # prepare context and everything and create corresponding RQJob
                jobs, rqjobs = ActionManageMixin.add(
                    action_class=NewSupportingInstructorAction,
                    logger=logger,
                    scheduler=scheduler,
                    triggers=Trigger.objects.filter(
                        active=True, action="new-supporting-instructor"),
                    context_objects=objs,
                    object_=task,
                    request=request,
                )
                jobs_created += jobs
                rqjobs_created += rqjobs

    return persons_created, tasks_created
Пример #5
0
    def testNotImplementedMethods(self):
        a = ActionManageMixin()

        with self.assertRaises(NotImplementedError):
            a.get_logger()
        with self.assertRaises(NotImplementedError):
            a.get_scheduler()
        with self.assertRaises(NotImplementedError):
            a.get_redis_connection()
        with self.assertRaises(NotImplementedError):
            a.get_triggers()
        with self.assertRaises(NotImplementedError):
            a.get_jobs()
        with self.assertRaises(NotImplementedError):
            a.objects()