import datetime import factory import wagtail_factories from opentech.apply.funds.models import ( ApplicationSubmission, ApplicationRevision, FundType, LabType, RequestForPartners, Round, SealedRound, ) from opentech.apply.funds.models.forms import ( ApplicationForm, ApplicationBaseForm, ApplicationBaseReviewForm, LabBaseForm, LabBaseReviewForm, RoundBaseForm, RoundBaseReviewForm, ) from opentech.apply.users.tests.factories import StaffFactory, UserFactory from opentech.apply.stream_forms.testing.factories import FormDataFactory from opentech.apply.home.factories import ApplyHomePageFactory from . import blocks __all__ = [ 'FundTypeFactory', 'ApplicationBaseFormFactory', 'ApplicationFormFactory', 'ApplicationRevisionFactory', 'ApplicationSubmissionFactory', 'RoundFactory', 'RoundBaseFormFactory', 'LabFactory', 'LabBaseFormFactory', 'LabSubmissionFactory', 'SealedRoundFactory', 'SealedSubmissionFactory', ] class FundTypeFactory(wagtail_factories.PageFactory): class Meta: model = FundType class Params: workflow_stages = 1 # Will need to update how the stages are identified as Fund Page changes workflow_name = factory.LazyAttribute(lambda o: list(FundType.WORKFLOW_CHOICES.keys())[o.workflow_stages - 1]) @factory.post_generation def parent(self, create, extracted_parent, **parent_kwargs): # THIS MUST BE THE FIRST POST GENERATION METHOD OR THE OBJECT WILL BE UNSAVED if create: if extracted_parent and parent_kwargs: raise ValueError('Cant pass a parent instance and attributes') if not extracted_parent: parent = ApplyHomePageFactory(**parent_kwargs) else: # Assume root node if no parent passed parent = extracted_parent parent.add_child(instance=self) @factory.post_generation def forms(self, create, extracted, **kwargs): if create: for _ in self.workflow.stages: # Generate a form based on all defined fields on the model ApplicationBaseFormFactory( application=self, **kwargs, ) ApplicationBaseReviewForm( application=self, **kwargs, ) class RequestForPartnersFactory(FundTypeFactory): class Meta: model = RequestForPartners class AbstractRelatedFormFactory(factory.DjangoModelFactory): class Meta: abstract = True form = factory.SubFactory('opentech.apply.funds.tests.factories.ApplicationFormFactory') class ApplicationBaseFormFactory(AbstractRelatedFormFactory): class Meta: model = ApplicationBaseForm application = factory.SubFactory(FundTypeFactory) class ApplicationFormFactory(factory.DjangoModelFactory): class Meta: model = ApplicationForm name = factory.Faker('word') form_fields = blocks.CustomFormFieldsFactory class RoundFactory(wagtail_factories.PageFactory): class Meta: model = Round class Params: now = factory.Trait( start_date=factory.LazyFunction(datetime.date.today), end_date=factory.LazyFunction(lambda: datetime.date.today() + datetime.timedelta(days=7)), ) title = factory.Sequence('Round {}'.format) start_date = factory.Sequence(lambda n: datetime.date.today() + datetime.timedelta(days=7 * n + 1)) end_date = factory.Sequence(lambda n: datetime.date.today() + datetime.timedelta(days=7 * (n + 1))) lead = factory.SubFactory(StaffFactory) @factory.post_generation def forms(self, create, extracted, **kwargs): if create: for _ in self.workflow.stages: # Generate a form based on all defined fields on the model RoundBaseFormFactory( round=self, **kwargs, ) RoundBaseReviewFormFactory( round=self, **kwargs, ) class SealedRoundFactory(RoundFactory): class Meta: model = SealedRound class TodayRoundFactory(RoundFactory): start_date = factory.LazyFunction(datetime.date.today) end_date = factory.LazyFunction(lambda: datetime.date.today() + datetime.timedelta(days=7)) class RoundBaseFormFactory(AbstractRelatedFormFactory): class Meta: model = RoundBaseForm round = factory.SubFactory(RoundFactory) class LabFactory(wagtail_factories.PageFactory): class Meta: model = LabType class Params: workflow_stages = 1 number_forms = 1 # Will need to update how the stages are identified as Fund Page changes workflow_name = factory.LazyAttribute(lambda o: list(FundType.WORKFLOW_CHOICES.keys())[o.workflow_stages - 1]) lead = factory.SubFactory(StaffFactory) @factory.post_generation def forms(self, create, extracted, **kwargs): if create: for _ in self.workflow.stages: # Generate a form based on all defined fields on the model LabBaseFormFactory( lab=self, **kwargs, ) LabBaseReviewFormFactory( lab=self, **kwargs, ) class LabBaseFormFactory(AbstractRelatedFormFactory): class Meta: model = LabBaseForm lab = factory.SubFactory(LabFactory) class ApplicationFormDataFactory(FormDataFactory): field_factory = blocks.CustomFormFieldsFactory class ApplicationSubmissionFactory(factory.DjangoModelFactory): class Meta: model = ApplicationSubmission class Params: workflow_stages = 1 draft_proposal = factory.Trait( status='draft_proposal', workflow_name='double', ) rejected = factory.Trait( status='rejected' ) form_fields = blocks.CustomFormFieldsFactory form_data = factory.SubFactory( ApplicationFormDataFactory, form_fields=factory.SelfAttribute('..form_fields'), ) page = factory.SubFactory(FundTypeFactory) workflow_name = factory.LazyAttribute(lambda o: list(FundType.WORKFLOW_CHOICES.keys())[o.workflow_stages - 1]) round = factory.SubFactory( RoundFactory, workflow_name=factory.SelfAttribute('..workflow_name'), lead=factory.SelfAttribute('..lead'), ) user = factory.SubFactory(UserFactory) lead = factory.SubFactory(StaffFactory) live_revision = None draft_revision = None @factory.post_generation def reviewers(self, create, reviewers, **kwargs): if create and reviewers: self.reviewers.set(reviewers) class SealedSubmissionFactory(ApplicationSubmissionFactory): page = factory.SubFactory(RequestForPartnersFactory) round = factory.SubFactory( SealedRoundFactory, workflow_name=factory.SelfAttribute('..workflow_name'), lead=factory.SelfAttribute('..lead'), now=True, ) class LabSubmissionFactory(ApplicationSubmissionFactory): round = None page = factory.SubFactory(LabFactory) class ApplicationRevisionFactory(factory.DjangoModelFactory): class Meta: model = ApplicationRevision submission = factory.SubFactory('opentech.apply.funds.tests.factories.ApplicationSubmissionFactory') form_data = factory.SubFactory( ApplicationFormDataFactory, form_fields=factory.SelfAttribute('..submission.form_fields'), for_factory=ApplicationSubmissionFactory, clean=True, ) class AbstractReviewFormFactory(factory.DjangoModelFactory): class Meta: abstract = True form = factory.SubFactory('opentech.apply.review.tests.factories.ReviewFormFactory') class ApplicationBaseReviewFormFactory(AbstractReviewFormFactory): class Meta: model = ApplicationBaseReviewForm application = factory.SubFactory(FundTypeFactory) class RoundBaseReviewFormFactory(AbstractReviewFormFactory): class Meta: model = RoundBaseReviewForm round = factory.SubFactory(RoundFactory) class LabBaseReviewFormFactory(AbstractReviewFormFactory): class Meta: model = LabBaseReviewForm lab = factory.SubFactory(LabFactory)