Skip to content
Snippets Groups Projects
models.py 8.62 KiB
Newer Older
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.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 list(FundType.WORKFLOW_CHOICES.keys())[stages - 1]


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)