Newer
Older
import datetime
from opentech.apply.funds.models import (
ApplicationForm,
FundType,
FundForm,
LabForm,
LabType,
Round,
from opentech.apply.users.tests.factories import UserFactory
from opentech.apply.users.groups import STAFF_GROUP_NAME
from . import blocks
Todd Dembrey
committed
__all__ = [
'FundTypeFactory',
'FundFormFactory',
'ApplicationFormFactory',
Todd Dembrey
committed
'RoundFactory',
Todd Dembrey
committed
'LabFactory',
'LabFormFactory',
]
def build_form(prefix=''):
if prefix:
prefix += '__'
return {
f'{prefix}form_fields__{i}__{field}__': ''
for i, field in enumerate(blocks.CustomFormFieldsFactory.factories.keys())
}
class FundTypeFactory(wagtail_factories.PageFactory):
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.WORKFLOWS.keys())[o.workflow_stages - 1])
@factory.post_generation
def forms(self, create, extracted, **kwargs):
if create:
fields.update(**kwargs)
for _ in range(len(self.workflow_class.stage_classes)):
# Generate a form based on all defined fields on the model
FundFormFactory(
fund=self,
**fields,
)
class AbstractRelatedFormFactory(factory.DjangoModelFactory):
class Meta:
model = AbstractRelatedForm
abstract = True
form = factory.SubFactory('opentech.apply.funds.tests.factories.ApplicationFormFactory')
class FundFormFactory(AbstractRelatedFormFactory):
model = FundForm
fund = factory.SubFactory(FundTypeFactory, parent=None)
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
title = factory.Sequence('Round {}'.format)
start_date = factory.LazyFunction(datetime.date.today)
end_date = factory.LazyFunction(lambda: datetime.date.today() + datetime.timedelta(days=7))
lead = factory.SubFactory(UserFactory, groups__name=STAFF_GROUP_NAME)
class RoundFormFactory(AbstractRelatedFormFactory):
class Meta:
model = RoundForm
round = factory.SubFactory(RoundFactory, parent=None)
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.WORKFLOWS.keys())[o.workflow_stages - 1])
class LabFormFactory(AbstractRelatedFormFactory):
class Meta:
model = LabForm
lab = factory.SubFactory(LabFactory, parent=None)
class ApplicationSubmissionFactory(factory.DjangoModelFactory):
class Meta:
model = ApplicationSubmission
form_fields = blocks.CustomFormFieldsFactory
page = factory.SubFactory(FundTypeFactory)
round = factory.SubFactory(RoundFactory)
user = factory.SubFactory(UserFactory)
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
@classmethod
def _generate(cls, strat, params):
params.update(**build_form())
return super()._generate(strat, params)
@classmethod
def _create(cls, model, *args, **kwargs):
# Make sure we have form_data so no error
kwargs['form_data'] = {}
return super()._create(model, *args, **kwargs)
@factory.post_generation
def form_data(self, create, extracted, **kwargs):
if not extracted:
# Ids are added but are not available in the cached version
self.refresh_from_db()
form_data = {}
for field in self.form_fields:
try:
answer = kwargs[field.block_type]
except KeyError:
answer = ''
form_data[field.id] = answer
self.form_data = form_data
self.save()