Skip to content
Snippets Groups Projects
models.py 8.72 KiB
Newer Older
  • Learn to ignore specific revisions
  • import factory
    
    import wagtail_factories
    
    from opentech.apply.funds.models import (
    
        ApplicationSubmission,
        ApplicationRevision,
    
        RequestForPartners,
    
        SealedRound,
    
    )
    from opentech.apply.funds.models.forms import (
        ApplicationForm,
        ApplicationBaseForm,
    
        ApplicationBaseReviewForm,
    
        LabBaseReviewForm,
    
        RoundBaseReviewForm,
    
    from opentech.apply.funds.workflow import ConceptProposal, Request
    
    
    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
    
        'ApplicationBaseFormFactory',
    
        'ApplicationRevisionFactory',
    
        'ApplicationSubmissionFactory',
    
        'InvitedToProposalFactory',
    
        'RequestForPartnersFactory',
    
        'SealedSubmissionFactory',
    
        'TodayRoundFactory',
    
        'workflow_for_stages',
    
    def workflow_for_stages(stages):
    
        return {
            1: Request.admin_name,
            2: ConceptProposal.admin_name,
        }[stages]
    
    class AbstractApplicationFactory(wagtail_factories.PageFactory):
    
        # Will need to update how the stages are identified as Fund Page changes
    
        workflow_name = factory.LazyAttribute(lambda o: workflow_for_stages(o.workflow_stages))
    
        @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,
    
                    ApplicationBaseReviewForm(
                        application=self,
                        **kwargs,
                    )
    
    class FundTypeFactory(AbstractApplicationFactory):
        class Meta:
            model = FundType
    
    
    class RequestForPartnersFactory(AbstractApplicationFactory):
    
        class Meta:
            model = RequestForPartners
    
    
    
    class AbstractRelatedFormFactory(factory.DjangoModelFactory):
        class Meta:
            abstract = True
        form = factory.SubFactory('opentech.apply.funds.tests.factories.ApplicationFormFactory')
    
    
    
    class ApplicationBaseFormFactory(AbstractRelatedFormFactory):
    
            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
    
                    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):
    
        round = factory.SubFactory(RoundFactory)
    
    class LabFactory(AbstractApplicationFactory):
    
        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
    
                    LabBaseReviewFormFactory(
                        lab=self,
                        **kwargs,
                    )
    
    class LabBaseFormFactory(AbstractRelatedFormFactory):
    
        lab = factory.SubFactory(LabFactory)
    
    class ApplicationFormDataFactory(FormDataFactory):
        field_factory = blocks.CustomFormFieldsFactory
    
    class ApplicationSubmissionFactory(factory.DjangoModelFactory):
        class Meta:
            model = ApplicationSubmission
    
    
        class Params:
            workflow_stages = 1
    
            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: workflow_for_stages(o.workflow_stages))
    
        round = factory.SubFactory(
            RoundFactory,
            workflow_name=factory.SelfAttribute('..workflow_name'),
            lead=factory.SelfAttribute('..lead'),
        )
    
        user = factory.SubFactory(UserFactory)
    
    Todd Dembrey's avatar
    Todd Dembrey committed
        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 InvitedToProposalFactory(ApplicationSubmissionFactory):
        class Params:
            workflow_stages = 2
            draft = factory.Trait(
                status='draft_proposal',
            )
    
        status = 'proposal_discussion'
        previous = factory.RelatedFactory(
            ApplicationSubmissionFactory,
            'next',
            round=factory.SelfAttribute('..round'),
            page=factory.SelfAttribute('..page'),
            status='invited_to_proposal',
        )
    
    
    
    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)