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, )
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)
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, )
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
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()