def create_subtype(atype, pk, name): create_if_needed( ActivitySubType, {'pk': pk}, name=name, type=atype, is_custom=False, )
def create_status(pk, name): create_if_needed( Status, {'pk': pk}, name=name, description=name, is_custom=False, )
def test_create_if_needed(self): title = 'Mister' pk = 1024 self.assertFalse(FakeCivility.objects.filter(pk=pk).exists()) civ = create_if_needed(FakeCivility, {'pk': pk}, title=title) self.assertIsInstance(civ, FakeCivility) self.assertEqual(pk, civ.pk) self.assertEqual(title, civ.title) civ = self.get_object_or_fail(FakeCivility, pk=pk) # Check has been saved self.assertEqual(title, civ.title) civ = create_if_needed(FakeCivility, {'pk': pk}, title=title + '2') self.assertEqual(title, civ.title)
def populate(self): already_populated = UserMessagePriority.objects.filter( pk=PRIO_IMP_PK).exists() for pk, title in USERMESSAGE_PRIORITIES.items(): create_if_needed(UserMessagePriority, {'pk': pk}, title=str(title), is_custom=False) SettingValue.objects.get_or_create(key_id=todo_reminder_key.id, defaults={'value': 9}) Job.objects.get_or_create( type_id=usermessages_send_type.id, defaults={ 'language': settings.LANGUAGE_CODE, 'status': Job.STATUS_OK, }, ) if not already_populated: RIGHT = BrickDetailviewLocation.RIGHT BrickDetailviewLocation.create_if_needed(brick_id=TodosBrick.id_, order=100, zone=RIGHT) BrickDetailviewLocation.create_if_needed(brick_id=MemosBrick.id_, order=200, zone=RIGHT) BrickDetailviewLocation.create_if_needed(brick_id=AlertsBrick.id_, order=300, zone=RIGHT) BrickDetailviewLocation.create_if_needed( brick_id=UserMessagesBrick.id_, order=400, zone=RIGHT) # BlockPortalLocation.create_or_update(brick_id=MemosBrick.id_, order=100) # BlockPortalLocation.create_or_update(brick_id=AlertsBrick.id_, order=200) # BlockPortalLocation.create_or_update(brick_id=UserMessagesBrick.id_, order=300) # BlockPortalLocation.create_or_update(app_name='creme_core', brick_id=MemosBrick.id_, order=100) # BlockPortalLocation.create_or_update(app_name='creme_core', brick_id=AlertsBrick.id_, order=200) # BlockPortalLocation.create_or_update(app_name='creme_core', brick_id=UserMessagesBrick.id_, order=300) BrickHomeLocation.objects.create(brick_id=MemosBrick.id_, order=100) BrickHomeLocation.objects.create(brick_id=AlertsBrick.id_, order=200) BrickHomeLocation.objects.create(brick_id=UserMessagesBrick.id_, order=300)
def populate(self): already_populated = UserMessagePriority.objects.filter( pk=PRIO_IMP_PK).exists() for pk, title in USERMESSAGE_PRIORITIES.items(): create_if_needed( UserMessagePriority, {'pk': pk}, title=str(title), is_custom=False, ) SettingValue.objects.get_or_create( key_id=todo_reminder_key.id, defaults={'value': 9}, ) Job.objects.get_or_create( type_id=usermessages_send_type.id, defaults={ 'language': settings.LANGUAGE_CODE, 'status': Job.STATUS_OK, }, ) if not already_populated: create_bdl = partial( BrickDetailviewLocation.objects.create_if_needed, zone=BrickDetailviewLocation.RIGHT, ) create_bdl(brick=TodosBrick, order=100) create_bdl(brick=MemosBrick, order=200) create_bdl(brick=AlertsBrick, order=300) create_bdl(brick=UserMessagesBrick, order=400) create_bhl = BrickHomeLocation.objects.create create_bhl(brick_id=MemosBrick.id_, order=100) create_bhl(brick_id=AlertsBrick.id_, order=200) create_bhl(brick_id=UserMessagesBrick.id_, order=300)
def populate(self): already_populated = RelationType.objects.filter( pk=constants.REL_SUB_IS_INVITED_TO, ).exists() Event = get_event_model() Contact = get_contact_model() Opportunity = get_opportunity_model() create_rtype = RelationType.create create_rtype( (constants.REL_SUB_IS_INVITED_TO, _('is invited to the event'), [Contact]), (constants.REL_OBJ_IS_INVITED_TO, _('has invited'), [Event]), is_internal=True, ) create_rtype( ( constants.REL_SUB_ACCEPTED_INVITATION, _('accepted the invitation to the event'), [Contact], ), ( constants.REL_OBJ_ACCEPTED_INVITATION, _('prepares to receive'), [Event], ), is_internal=True, ) create_rtype( ( constants.REL_SUB_REFUSED_INVITATION, _('refused the invitation to the event'), [Contact], ), ( constants.REL_OBJ_REFUSED_INVITATION, _('do not prepare to receive any more'), [Event], ), is_internal=True, ) create_rtype( (constants.REL_SUB_CAME_EVENT, _('came to the event'), [Contact]), (constants.REL_OBJ_CAME_EVENT, _('received'), [Event]), is_internal=True, ) create_rtype( (constants.REL_SUB_NOT_CAME_EVENT, _('did not come to the event'), [Contact]), (constants.REL_OBJ_NOT_CAME_EVENT, _('did not receive'), [Event]), is_internal=True, ) create_rtype( ( constants.REL_SUB_GEN_BY_EVENT, _('generated by the event'), [Opportunity], ), ( constants.REL_OBJ_GEN_BY_EVENT, _('(event) has generated the opportunity'), [Event], ), is_internal=True, ) # --------------------------- HeaderFilter.objects.create_if_needed( pk=constants.DEFAULT_HFILTER_EVENT, name=_('Event view'), model=Event, cells_desc=[ (EntityCellRegularField, { 'name': 'name' }), (EntityCellRegularField, { 'name': 'type' }), (EntityCellRegularField, { 'name': 'start_date' }), (EntityCellRegularField, { 'name': 'end_date' }), ], ) # --------------------------- base_groups_desc = [ { 'name': _('General information'), 'layout': LAYOUT_DUAL_FIRST, 'cells': [ (EntityCellRegularField, { 'name': 'user' }), (EntityCellRegularField, { 'name': 'name' }), (EntityCellRegularField, { 'name': 'type' }), (EntityCellRegularField, { 'name': 'place' }), (EntityCellRegularField, { 'name': 'start_date' }), (EntityCellRegularField, { 'name': 'end_date' }), (EntityCellRegularField, { 'name': 'budget' }), (EntityCellRegularField, { 'name': 'final_cost' }), ( EntityCellCustomFormSpecial, { 'name': EntityCellCustomFormSpecial.REMAINING_REGULARFIELDS }, ), ], }, { 'name': _('Description'), 'layout': LAYOUT_DUAL_SECOND, 'cells': [ (EntityCellRegularField, { 'name': 'description' }), ], }, { 'name': _('Custom fields'), 'layout': LAYOUT_DUAL_SECOND, 'cells': [ ( EntityCellCustomFormSpecial, { 'name': EntityCellCustomFormSpecial.REMAINING_CUSTOMFIELDS }, ), ], }, ] CustomFormConfigItem.objects.create_if_needed( descriptor=custom_forms.EVENT_CREATION_CFORM, groups_desc=[ *base_groups_desc, { 'name': _('Properties'), 'cells': [ ( EntityCellCustomFormSpecial, { 'name': EntityCellCustomFormSpecial.CREME_PROPERTIES }, ), ], }, { 'name': _('Relationships'), 'cells': [ ( EntityCellCustomFormSpecial, { 'name': EntityCellCustomFormSpecial.RELATIONS }, ), ], }, ], ) CustomFormConfigItem.objects.create_if_needed( descriptor=custom_forms.EVENT_EDITION_CFORM, groups_desc=base_groups_desc, ) # --------------------------- SearchConfigItem.objects.create_if_needed( Event, ['name', 'description', 'type__name'], ) # --------------------------- # TODO: move to "not already_populated" section in creme2.4 if not MenuConfigItem.objects.filter( entry_id__startswith='events-').exists(): container = MenuConfigItem.objects.get_or_create( entry_id=ContainerEntry.id, entry_data={'label': _('Tools')}, defaults={'order': 100}, )[0] MenuConfigItem.objects.create( entry_id=EventsEntry.id, parent=container, order=200, ) # --------------------------- if not already_populated: for i, name in enumerate( [_('Show'), _('Conference'), _('Breakfast'), _('Brunch')], start=1, ): create_if_needed(EventType, {'pk': i}, name=name) RIGHT = BrickDetailviewLocation.RIGHT BrickDetailviewLocation.objects.multi_create( defaults={ 'model': Event, 'zone': BrickDetailviewLocation.LEFT }, data=[ { 'order': 5 }, # generic info block { 'brick': core_bricks.CustomFieldsBrick, 'order': 40 }, { 'brick': core_bricks.PropertiesBrick, 'order': 450 }, { 'brick': core_bricks.RelationsBrick, 'order': 500 }, { 'brick': bricks.ResultsBrick, 'order': 2, 'zone': RIGHT }, { 'brick': core_bricks.HistoryBrick, 'order': 20, 'zone': RIGHT }, ], ) if apps.is_installed('creme.assistants'): logger.info('Assistants app is installed' ' => we use the assistants blocks on detail view') from creme.assistants import bricks as a_bricks BrickDetailviewLocation.objects.multi_create( defaults={ 'model': Event, 'zone': RIGHT }, data=[ { 'brick': a_bricks.TodosBrick, 'order': 100 }, { 'brick': a_bricks.MemosBrick, 'order': 200 }, { 'brick': a_bricks.AlertsBrick, 'order': 300 }, { 'brick': a_bricks.UserMessagesBrick, 'order': 400 }, ]) if apps.is_installed('creme.documents'): # logger.info('Documents app is installed # => we use the Documents blocks on detail view') from creme.documents.bricks import LinkedDocsBrick BrickDetailviewLocation.objects.create_if_needed( brick=LinkedDocsBrick, order=600, zone=RIGHT, model=Event, )
def populate(self): already_populated = RelationType.objects.filter( pk=constants.REL_SUB_LINKED_2_TICKET).exists() Ticket = get_ticket_model() TicketTemplate = get_tickettemplate_model() RelationType.create( (constants.REL_SUB_LINKED_2_TICKET, _('is linked to the ticket')), (constants.REL_OBJ_LINKED_2_TICKET, _('(ticket) linked to the entity'), [Ticket]), ) if apps.is_installed('creme.activities'): logger.info( 'Activities app is installed => a Ticket can be the subject of an Activity' ) from creme.activities.constants import REL_SUB_ACTIVITY_SUBJECT RelationType.objects.get( pk=REL_SUB_ACTIVITY_SUBJECT).add_subject_ctypes(Ticket) # --------------------------- for pk, name in BASE_STATUS: create_if_needed(Status, {'pk': pk}, name=str(name), is_custom=False, order=pk) # --------------------------- create_hf = HeaderFilter.create create_hf( pk=constants.DEFAULT_HFILTER_TICKET, model=Ticket, name=_('Ticket view'), cells_desc=[ (EntityCellRegularField, { 'name': 'number' }), (EntityCellRegularField, { 'name': 'title' }), (EntityCellRegularField, { 'name': 'status' }), (EntityCellRegularField, { 'name': 'priority' }), (EntityCellRegularField, { 'name': 'criticity' }), (EntityCellRegularField, { 'name': 'closing_date' }), ], ) create_hf( pk=constants.DEFAULT_HFILTER_TTEMPLATE, model=TicketTemplate, name=_('Ticket template view'), cells_desc=[ (EntityCellRegularField, { 'name': 'title' }), (EntityCellRegularField, { 'name': 'status' }), (EntityCellRegularField, { 'name': 'priority' }), (EntityCellRegularField, { 'name': 'criticity' }), ], ) # --------------------------- SearchConfigItem.create_if_needed(Ticket, [ 'title', 'number', 'description', 'status__name', 'priority__name', 'criticity__name', ]) # --------------------------- if not already_populated: for i, name in enumerate( [_('Low'), _('Normal'), _('High'), _('Urgent'), _('Blocking')], start=1): create_if_needed(Priority, {'pk': i}, name=name, order=i) for i, name in enumerate([ _('Minor'), _('Major'), _('Feature'), _('Critical'), _('Enhancement'), _('Error') ], start=1): create_if_needed(Criticity, {'pk': i}, name=name, order=i) # --------------------------- rbi = RelationBrickItem.objects.create_if_needed( constants.REL_OBJ_LINKED_2_TICKET) create_bdl = partial( BrickDetailviewLocation.objects.create_if_needed, model=Ticket) LEFT = BrickDetailviewLocation.LEFT RIGHT = BrickDetailviewLocation.RIGHT BrickDetailviewLocation.objects.create_for_model_brick( order=5, zone=LEFT, model=Ticket) create_bdl(brick=core_bricks.CustomFieldsBrick, order=40, zone=LEFT) create_bdl(brick=core_bricks.PropertiesBrick, order=450, zone=LEFT) create_bdl(brick=core_bricks.RelationsBrick, order=500, zone=LEFT) create_bdl(brick=rbi.brick_id, order=1, zone=RIGHT) create_bdl(brick=core_bricks.HistoryBrick, order=20, zone=RIGHT) if apps.is_installed('creme.assistants'): logger.info( 'Assistants app is installed => we use the assistants blocks on detail view' ) from creme.assistants import bricks as a_bricks create_bdl(brick=a_bricks.TodosBrick, order=100, zone=RIGHT) create_bdl(brick=a_bricks.MemosBrick, order=200, zone=RIGHT) create_bdl(brick=a_bricks.AlertsBrick, order=300, zone=RIGHT) create_bdl(brick=a_bricks.UserMessagesBrick, order=400, zone=RIGHT) if apps.is_installed('creme.documents'): # logger.info("Documents app is installed => we use the documents block on Ticket's detail views") from creme.documents.bricks import LinkedDocsBrick create_bdl(brick=LinkedDocsBrick, order=600, zone=RIGHT) # --------------------------- if apps.is_installed('creme.persons'): try: from creme.persons import get_contact_model, get_organisation_model except ImportError as e: logger.info(str(e)) else: from creme.tickets.buttons import Linked2TicketButton create_bmi = ButtonMenuItem.create_if_needed create_bmi(pk='tickets-linked_contact_button', model=get_contact_model(), button=Linked2TicketButton, order=50) create_bmi(pk='tickets-linked_orga_button', model=get_organisation_model(), button=Linked2TicketButton, order=50) logger.info( "'Persons' app is installed => add button 'Linked to a ticket' to Contact & Organisation" )
def populate(self): already_populated = RelationType.objects.filter(pk=constants.REL_SUB_IS_INVITED_TO).exists() Event = get_event_model() Contact = get_contact_model() Opportunity = get_opportunity_model() create_rtype = RelationType.create create_rtype((constants.REL_SUB_IS_INVITED_TO, _(u'is invited to the event'), [Contact]), (constants.REL_OBJ_IS_INVITED_TO, _(u'has invited'), [Event]), is_internal=True, ) create_rtype((constants.REL_SUB_ACCEPTED_INVITATION, _(u'accepted the invitation to the event'), [Contact]), (constants.REL_OBJ_ACCEPTED_INVITATION, _(u'prepares to receive'), [Event]), is_internal=True, ) create_rtype((constants.REL_SUB_REFUSED_INVITATION, _(u'refused the invitation to the event'), [Contact]), (constants.REL_OBJ_REFUSED_INVITATION, _(u'do not prepare to receive any more'), [Event]), is_internal=True, ) create_rtype((constants.REL_SUB_CAME_EVENT, _(u'came to the event'), [Contact]), (constants.REL_OBJ_CAME_EVENT, _(u'received'), [Event]), is_internal=True, ) create_rtype((constants.REL_SUB_NOT_CAME_EVENT, _(u'did not come to the event'), [Contact]), (constants.REL_OBJ_NOT_CAME_EVENT, _(u'did not receive'), [Event]), is_internal=True, ) create_rtype((constants.REL_SUB_GEN_BY_EVENT, _(u'generated by the event'), [Opportunity]), (constants.REL_OBJ_GEN_BY_EVENT, _(u'(event) has generated the opportunity'), [Event]), is_internal=True, ) # --------------------------- HeaderFilter.create(pk=constants.DEFAULT_HFILTER_EVENT, name=_(u'Event view'), model=Event, cells_desc=[(EntityCellRegularField, {'name': 'name'}), (EntityCellRegularField, {'name': 'type'}), (EntityCellRegularField, {'name': 'start_date'}), (EntityCellRegularField, {'name': 'end_date'}), ], ) # --------------------------- SearchConfigItem.create_if_needed(Event, ['name', 'description', 'type__name']) # --------------------------- if not already_populated: for i, name in enumerate([_(u'Show'), _(u'Conference'), _(u'Breakfast'), _(u'Brunch')], start=1): create_if_needed(EventType, {'pk': i}, name=name) create_bdl = BrickDetailviewLocation.create_if_needed LEFT = BrickDetailviewLocation.LEFT RIGHT = BrickDetailviewLocation.RIGHT BrickDetailviewLocation.create_4_model_brick( order=5, zone=LEFT, model=Event) create_bdl(brick_id=core_bricks.CustomFieldsBrick.id_, order=40, zone=LEFT, model=Event) create_bdl(brick_id=core_bricks.PropertiesBrick.id_, order=450, zone=LEFT, model=Event) create_bdl(brick_id=core_bricks.RelationsBrick.id_, order=500, zone=LEFT, model=Event) create_bdl(brick_id=bricks.ResutsBrick.id_, order=2, zone=RIGHT, model=Event) create_bdl(brick_id=core_bricks.HistoryBrick.id_, order=20, zone=RIGHT, model=Event) if apps.is_installed('creme.assistants'): logger.info('Assistants app is installed => we use the assistants blocks on detail view') from creme.assistants import bricks as a_bricks create_bdl(brick_id=a_bricks.TodosBrick.id_, order=100, zone=RIGHT, model=Event) create_bdl(brick_id=a_bricks.MemosBrick.id_, order=200, zone=RIGHT, model=Event) create_bdl(brick_id=a_bricks.AlertsBrick.id_, order=300, zone=RIGHT, model=Event) create_bdl(brick_id=a_bricks.UserMessagesBrick.id_, order=400, zone=RIGHT, model=Event) if apps.is_installed('creme.documents'): # logger.info('Documents app is installed => we use the Documents blocks on detail view') from creme.documents.bricks import LinkedDocsBrick create_bdl(brick_id=LinkedDocsBrick.id_, order=600, zone=RIGHT, model=Event)
def populate(self): already_populated = RelationType.objects.filter(pk=constants.REL_SUB_PROJECT_MANAGER).exists() Contact = get_contact_model() Activity = get_activity_model() Project = get_project_model() ProjectTask = get_task_model() create_rtype = RelationType.create create_rtype( (constants.REL_SUB_PROJECT_MANAGER, _('is one of the leaders of this project'), [Contact]), (constants.REL_OBJ_PROJECT_MANAGER, _('has as leader'), [Project]), ) create_rtype( (constants.REL_SUB_LINKED_2_PTASK, _('is related to the task of project'), [Activity]), (constants.REL_OBJ_LINKED_2_PTASK, _('includes the activity'), [ProjectTask]), is_internal=True, minimal_display=(False, True), ) create_rtype( (constants.REL_SUB_PART_AS_RESOURCE, _('is a resource of'), [Contact]), (constants.REL_OBJ_PART_AS_RESOURCE, _('has as a resource'), [Activity]), is_internal=True, ) # --------------------------- for pk, statusdesc in constants.TASK_STATUS.items(): create_if_needed(TaskStatus, {'pk': pk}, name=str(statusdesc.name), order=pk, description=str(statusdesc.verbose_name), is_custom=False, ) # --------------------------- create_hf = HeaderFilter.create create_hf(pk=constants.DEFAULT_HFILTER_PROJECT, model=Project, name=_('Project view'), cells_desc=[(EntityCellRegularField, {'name': 'name'}), (EntityCellRegularField, {'name': 'start_date'}), (EntityCellRegularField, {'name': 'end_date'}), (EntityCellRegularField, {'name': 'status'}), (EntityCellRegularField, {'name': 'description'}), ], ) # Used in form create_hf(pk='projects-hf_task', name=_('Task view'), model=ProjectTask, cells_desc=[(EntityCellRegularField, {'name': 'title'}), (EntityCellRegularField, {'name': 'description'}), ], ) # Used in form create_hf(pk='projects-hf_resource', name=_('Resource view'), model=Resource, cells_desc=[(EntityCellRegularField, {'name': 'linked_contact'}), (EntityCellRegularField, {'name': 'hourly_cost'}), ], ) # --------------------------- create_searchconf = SearchConfigItem.create_if_needed create_searchconf(Project, ['name', 'description', 'status__name']) create_searchconf(Resource, ['linked_contact__last_name', 'linked_contact__first_name', 'hourly_cost']) create_searchconf(ProjectTask, ['linked_project__name', 'duration', 'tstatus__name']) # --------------------------- if not already_populated: create_if_needed(ProjectStatus, {'pk': 1}, name=_('Invitation to tender'), order=1, description=_('Response to an invitation to tender')) create_if_needed(ProjectStatus, {'pk': 2}, name=_('Initialization'), order=2, description=_('The project is starting')) create_if_needed(ProjectStatus, {'pk': 3}, name=_('Preliminary phase'), order=3, description=_('The project is in the process of analysis and design')) create_if_needed(ProjectStatus, {'pk': 4}, name=_('Achievement'), order=4, description=_('The project is being implemented')) create_if_needed(ProjectStatus, {'pk': 5}, name=_('Tests'), order=5, description=_('The project is in the testing process (unit / integration / functional)')) create_if_needed(ProjectStatus, {'pk': 6}, name=_('User acceptance tests'), order=6, description=_('The project is in the user acceptance testing process')) create_if_needed(ProjectStatus, {'pk': 7}, name=_('Finished'), order=7, description=_('The project is finished')) # --------------------------- create_bdl = BrickDetailviewLocation.objects.create_if_needed create_bdl_4_model = BrickDetailviewLocation.objects.create_for_model_brick TOP = BrickDetailviewLocation.TOP LEFT = BrickDetailviewLocation.LEFT RIGHT = BrickDetailviewLocation.RIGHT create_bdl(brick=bricks.ProjectTasksBrick, order=2, zone=TOP, model=Project) create_bdl_4_model( order=5, zone=LEFT, model=Project) create_bdl(brick=bricks.ProjectExtraInfoBrick, order=30, zone=LEFT, model=Project) create_bdl(brick=core_bricks.CustomFieldsBrick, order=40, zone=LEFT, model=Project) create_bdl(brick=core_bricks.PropertiesBrick, order=450, zone=LEFT, model=Project) create_bdl(brick=core_bricks.RelationsBrick, order=500, zone=LEFT, model=Project) create_bdl(brick=core_bricks.HistoryBrick, order=20, zone=RIGHT, model=Project) create_bdl(brick=bricks.TaskResourcesBrick, order=2, zone=TOP, model=ProjectTask) create_bdl(brick=bricks.TaskActivitiesBrick, order=4, zone=TOP, model=ProjectTask) create_bdl_4_model( order=5, zone=LEFT, model=ProjectTask) create_bdl(brick=bricks.TaskExtraInfoBrick, order=30, zone=LEFT, model=ProjectTask) create_bdl(brick=core_bricks.CustomFieldsBrick, order=40, zone=LEFT, model=ProjectTask) create_bdl(brick=bricks.ParentTasksBrick, order=50, zone=LEFT, model=ProjectTask) create_bdl(brick=core_bricks.PropertiesBrick, order=450, zone=LEFT, model=ProjectTask) create_bdl(brick=core_bricks.RelationsBrick, order=500, zone=LEFT, model=ProjectTask) create_bdl(brick=core_bricks.HistoryBrick, order=20, zone=RIGHT, model=ProjectTask) if apps.is_installed('creme.assistants'): logger.info('Assistants app is installed => we use the assistants blocks on detail views') from creme.assistants import bricks as a_bricks for model in (Project, ProjectTask): create_bdl(brick=a_bricks.TodosBrick, order=100, zone=RIGHT, model=model) create_bdl(brick=a_bricks.MemosBrick, order=200, zone=RIGHT, model=model) create_bdl(brick=a_bricks.AlertsBrick, order=300, zone=RIGHT, model=model) create_bdl(brick=a_bricks.UserMessagesBrick, order=400, zone=RIGHT, model=model) if apps.is_installed('creme.documents'): # logger.info('Documents app is installed => we use the documents block on detail views') from creme.documents.bricks import LinkedDocsBrick for model in (Project, ProjectTask): create_bdl(brick=LinkedDocsBrick, order=600, zone=RIGHT, model=model)
def populate(self): already_populated = RelationType.objects.filter( pk=constants.REL_SUB_BILL_ISSUED, ).exists() Contact = persons.get_contact_model() Organisation = persons.get_organisation_model() Product = products.get_product_model() Service = products.get_service_model() # Relationships --------------------------- line_entities = [*lines_registry] create_rtype = RelationType.create create_rtype( (constants.REL_SUB_BILL_ISSUED, _('issued by'), BILLING_MODELS), (constants.REL_OBJ_BILL_ISSUED, _('has issued'), [Organisation]), is_internal=True, minimal_display=(False, True), ) rt_sub_bill_received = create_rtype( (constants.REL_SUB_BILL_RECEIVED, _('received by'), BILLING_MODELS), (constants.REL_OBJ_BILL_RECEIVED, _('has received'), [Organisation, Contact]), is_internal=True, minimal_display=(False, True), )[0] create_rtype( (constants.REL_SUB_HAS_LINE, _('had the line'), BILLING_MODELS), (constants.REL_OBJ_HAS_LINE, _('is the line of'), line_entities), is_internal=True, minimal_display=(True, True), ) create_rtype( (constants.REL_SUB_LINE_RELATED_ITEM, _('has the related item'), line_entities), (constants.REL_OBJ_LINE_RELATED_ITEM, _('is the related item of'), [Product, Service]), is_internal=True, ) create_rtype( ( constants.REL_SUB_CREDIT_NOTE_APPLIED, _('is used in the billing document'), [CreditNote], ), ( constants.REL_OBJ_CREDIT_NOTE_APPLIED, _('uses the credit note'), [Quote, SalesOrder, Invoice], ), is_internal=True, minimal_display=(True, True), ) if apps.is_installed('creme.activities'): logger.info( 'Activities app is installed ' '=> an Invoice/Quote/SalesOrder can be the subject of an Activity' ) from creme.activities.constants import REL_SUB_ACTIVITY_SUBJECT RelationType.objects.get( pk=REL_SUB_ACTIVITY_SUBJECT, ).add_subject_ctypes( Invoice, Quote, SalesOrder) # Payment Terms --------------------------- create_if_needed( PaymentTerms, {'pk': 1}, name=_('Deposit'), description=_(r'20% deposit will be required'), is_custom=False, ) # SalesOrder Status --------------------------- def create_order_status(pk, name, **kwargs): create_if_needed(SalesOrderStatus, {'pk': pk}, name=name, **kwargs) # NB: pk=1 + is_custom=False --> default status # (used when a quote is converted in invoice for example) create_order_status(1, pgettext('billing-salesorder', 'Issued'), order=1, is_custom=False) if not already_populated: create_order_status(2, pgettext('billing-salesorder', 'Accepted'), order=3) create_order_status(3, pgettext('billing-salesorder', 'Rejected'), order=4) create_order_status(4, pgettext('billing-salesorder', 'Created'), order=2) # Invoice Status --------------------------- def create_invoice_status(pk, name, **kwargs): create_if_needed(InvoiceStatus, {'pk': pk}, name=name, **kwargs) create_invoice_status( 1, pgettext('billing-invoice', 'Draft'), order=1, is_custom=False, ) # Default status create_invoice_status( 2, pgettext('billing-invoice', 'To be sent'), order=2, is_custom=False, ) if not already_populated: create_invoice_status( 3, pgettext('billing-invoice', 'Sent'), order=3, pending_payment=True, ) create_invoice_status( 4, pgettext('billing-invoice', 'Resulted'), order=5, ) create_invoice_status( 5, pgettext('billing-invoice', 'Partly resulted'), order=4, pending_payment=True, ) create_invoice_status( 6, _('Collection'), order=7, ) create_invoice_status( 7, _('Resulted collection'), order=6, ) create_invoice_status( 8, pgettext('billing-invoice', 'Canceled'), order=8, ) # CreditNote Status --------------------------- def create_cnote_status(pk, name, **kwargs): create_if_needed(CreditNoteStatus, {'pk': pk}, name=name, **kwargs) create_cnote_status(1, pgettext('billing-creditnote', 'Draft'), order=1, is_custom=False) if not already_populated: create_cnote_status(2, pgettext('billing-creditnote', 'Issued'), order=2) create_cnote_status(3, pgettext('billing-creditnote', 'Consumed'), order=3) create_cnote_status(4, pgettext('billing-creditnote', 'Out of date'), order=4) # --------------------------- EntityFilter.objects.smart_update_or_create( 'billing-invoices_unpaid', name=_('Invoices unpaid'), model=Invoice, user='******', conditions=[ condition_handler.RegularFieldConditionHandler.build_condition( model=Invoice, operator=operators.EqualsOperator, field_name='status__pending_payment', values=[True], ), ], ) EntityFilter.objects.smart_update_or_create( 'billing-invoices_unpaid_late', name=_('Invoices unpaid and late'), model=Invoice, user='******', conditions=[ condition_handler.RegularFieldConditionHandler.build_condition( model=Invoice, operator=operators.EqualsOperator, field_name='status__pending_payment', values=[True], ), condition_handler.DateRegularFieldConditionHandler. build_condition( model=Invoice, field_name='expiration_date', date_range='in_past', ), ], ) current_year_invoice_filter = EntityFilter.objects.smart_update_or_create( 'billing-current_year_invoices', name=_('Current year invoices'), model=Invoice, user='******', conditions=[ condition_handler.DateRegularFieldConditionHandler. build_condition( model=Invoice, field_name='issuing_date', date_range='current_year', ), ], ) current_year_unpaid_invoice_filter = EntityFilter.objects.smart_update_or_create( 'billing-current_year_unpaid_invoices', name=_('Current year and unpaid invoices'), model=Invoice, user='******', conditions=[ condition_handler.DateRegularFieldConditionHandler. build_condition( model=Invoice, field_name='issuing_date', date_range='current_year', ), condition_handler.RegularFieldConditionHandler.build_condition( model=Invoice, operator=operators.EqualsOperator, field_name='status__pending_payment', values=[True], ), ], ) # --------------------------- def create_hf(hf_pk, name, model, status=True): HeaderFilter.objects.create_if_needed( pk=hf_pk, name=name, model=model, cells_desc=[ (EntityCellRegularField, { 'name': 'name' }), EntityCellRelation(model=model, rtype=rt_sub_bill_received), (EntityCellRegularField, { 'name': 'number' }), (EntityCellRegularField, { 'name': 'status' }) if status else None, (EntityCellRegularField, { 'name': 'total_no_vat' }), (EntityCellRegularField, { 'name': 'issuing_date' }), (EntityCellRegularField, { 'name': 'expiration_date' }), ], ) create_hf(constants.DEFAULT_HFILTER_INVOICE, _('Invoice view'), Invoice) create_hf(constants.DEFAULT_HFILTER_QUOTE, _('Quote view'), Quote) create_hf(constants.DEFAULT_HFILTER_ORDER, _('Sales order view'), SalesOrder) create_hf(constants.DEFAULT_HFILTER_CNOTE, _('Credit note view'), CreditNote) create_hf( constants.DEFAULT_HFILTER_TEMPLATE, _('Template view'), TemplateBase, status=False, ) def create_hf_lines(hf_pk, name, model): build_cell = EntityCellRegularField.build HeaderFilter.objects.create_if_needed( pk=hf_pk, name=name, model=model, cells_desc=[ build_cell(model=model, name='on_the_fly_item'), build_cell(model=model, name='quantity'), build_cell(model=model, name='unit_price'), ], ) create_hf_lines('billing-hg_product_lines', _('Product lines view'), ProductLine) create_hf_lines('billing-hg_service_lines', _('Service lines view'), ServiceLine) # --------------------------- creation_only_groups_desc = [ { 'name': _('Properties'), 'cells': [ ( EntityCellCustomFormSpecial, { 'name': EntityCellCustomFormSpecial.CREME_PROPERTIES }, ), ], }, { 'name': _('Relationships'), 'cells': [ ( EntityCellCustomFormSpecial, { 'name': EntityCellCustomFormSpecial.RELATIONS }, ), ], }, ] def build_custom_form_items(model, creation_descriptor, edition_descriptor, field_names): base_groups = [ { 'name': _('General information'), 'layout': LAYOUT_DUAL_FIRST, 'cells': [ *((EntityCellRegularField, { 'name': fname }) for fname in field_names), ( EntityCellCustomFormSpecial, { 'name': EntityCellCustomFormSpecial. REMAINING_REGULARFIELDS }, ), ], }, { 'name': _('Organisations'), 'layout': LAYOUT_DUAL_SECOND, 'cells': [ BillingSourceSubCell(model=model).into_cell(), BillingTargetSubCell(model=model).into_cell(), ], }, { 'name': _('Description'), 'layout': LAYOUT_DUAL_SECOND, 'cells': [ (EntityCellRegularField, { 'name': 'description' }), ], }, { 'name': _('Custom fields'), 'layout': LAYOUT_DUAL_SECOND, 'cells': [ ( EntityCellCustomFormSpecial, { 'name': EntityCellCustomFormSpecial. REMAINING_CUSTOMFIELDS }, ), ], }, ] CustomFormConfigItem.objects.create_if_needed( descriptor=creation_descriptor, groups_desc=[ *base_groups, *creation_only_groups_desc, ], ) CustomFormConfigItem.objects.create_if_needed( descriptor=edition_descriptor, groups_desc=base_groups, ) build_custom_form_items( model=Invoice, creation_descriptor=custom_forms.INVOICE_CREATION_CFORM, edition_descriptor=custom_forms.INVOICE_EDITION_CFORM, field_names=[ 'user', 'name', 'number', 'status', 'issuing_date', 'expiration_date', 'discount', 'currency', 'comment', 'additional_info', 'payment_terms', 'payment_type', 'buyers_order_number', ], ) build_custom_form_items( model=Quote, creation_descriptor=custom_forms.QUOTE_CREATION_CFORM, edition_descriptor=custom_forms.QUOTE_EDITION_CFORM, field_names=[ 'user', 'name', 'number', 'status', 'issuing_date', 'expiration_date', 'discount', 'currency', 'comment', 'additional_info', 'payment_terms', 'acceptation_date', ], ) build_custom_form_items( model=SalesOrder, creation_descriptor=custom_forms.ORDER_CREATION_CFORM, edition_descriptor=custom_forms.ORDER_EDITION_CFORM, field_names=[ 'user', 'name', 'number', 'status', 'issuing_date', 'expiration_date', 'discount', 'currency', 'comment', 'additional_info', 'payment_terms', ], ) build_custom_form_items( model=CreditNote, creation_descriptor=custom_forms.CNOTE_CREATION_CFORM, edition_descriptor=custom_forms.CNOTE_EDITION_CFORM, field_names=[ 'user', 'name', 'number', 'status', 'issuing_date', 'expiration_date', 'discount', 'currency', 'comment', 'additional_info', 'payment_terms', ], ) common_template_groups_desc = [ { 'name': _('General information'), 'cells': [ (EntityCellRegularField, { 'name': 'user' }), (EntityCellRegularField, { 'name': 'name' }), (EntityCellRegularField, { 'name': 'number' }), BillingTemplateStatusSubCell( model=TemplateBase).into_cell(), (EntityCellRegularField, { 'name': 'issuing_date' }), (EntityCellRegularField, { 'name': 'expiration_date' }), (EntityCellRegularField, { 'name': 'discount' }), (EntityCellRegularField, { 'name': 'currency' }), (EntityCellRegularField, { 'name': 'comment' }), (EntityCellRegularField, { 'name': 'additional_info' }), (EntityCellRegularField, { 'name': 'payment_terms' }), ( EntityCellCustomFormSpecial, { 'name': EntityCellCustomFormSpecial.REMAINING_REGULARFIELDS }, ), ], }, { 'name': _('Organisations'), 'cells': [ BillingSourceSubCell(model=TemplateBase).into_cell(), BillingTargetSubCell(model=TemplateBase).into_cell(), ], }, { 'name': _('Description'), 'cells': [ (EntityCellRegularField, { 'name': 'description' }), ], }, { 'name': _('Custom fields'), 'cells': [ ( EntityCellCustomFormSpecial, { 'name': EntityCellCustomFormSpecial.REMAINING_CUSTOMFIELDS }, ), ], }, ] CustomFormConfigItem.objects.create_if_needed( descriptor=custom_forms.BTEMPLATE_CREATION_CFORM, groups_desc=[ *common_template_groups_desc, *creation_only_groups_desc, ], ) CustomFormConfigItem.objects.create_if_needed( descriptor=custom_forms.BTEMPLATE_EDITION_CFORM, groups_desc=common_template_groups_desc, ) # --------------------------- get_ct = ContentType.objects.get_for_model engine_id = '' flavour_id = '' if 'creme.billing.exporters.xhtml2pdf.Xhtml2pdfExportEngine' in settings.BILLING_EXPORTERS: from creme.billing.exporters.xhtml2pdf import Xhtml2pdfExportEngine from creme.creme_core.utils import l10n # TODO: add the country in settings & use it... country = l10n.FR language = 'fr_FR' theme = 'cappuccino' try: Xhtml2pdfExportEngine.FLAVOURS_INFO[country][language][theme] except KeyError: pass else: engine_id = Xhtml2pdfExportEngine.id flavour_id = f'{country}/{language}/{theme}' for model in (CreditNote, Invoice, Quote, SalesOrder, TemplateBase): ExporterConfigItem.objects.get_or_create( content_type=get_ct(model), defaults={ 'engine_id': engine_id, 'flavour_id': flavour_id, }, ) # --------------------------- for model in (Invoice, CreditNote, Quote, SalesOrder): SearchConfigItem.objects.create_if_needed( model, ['name', 'number', 'status__name']) for model in (ProductLine, ServiceLine): SearchConfigItem.objects.create_if_needed(model, [], disabled=True) # --------------------------- create_svalue = SettingValue.objects.get_or_create create_svalue(key_id=setting_keys.payment_info_key.id, defaults={'value': True}) create_svalue(key_id=setting_keys.button_redirection_key.id, defaults={'value': True}) # --------------------------- # TODO: move to "not already_populated" section in creme2.4 if not MenuConfigItem.objects.filter( entry_id__startswith='billing-').exists(): container = MenuConfigItem.objects.get_or_create( entry_id=ContainerEntry.id, entry_data={'label': _('Management')}, defaults={'order': 50}, )[0] create_mitem = partial(MenuConfigItem.objects.create, parent=container) create_mitem(entry_id=menu.QuotesEntry.id, order=10) create_mitem(entry_id=menu.InvoicesEntry.id, order=15) create_mitem(entry_id=menu.CreditNotesEntry.id, order=50) create_mitem(entry_id=menu.SalesOrdersEntry.id, order=55) create_mitem(entry_id=menu.ProductLinesEntry.id, order=200) create_mitem(entry_id=menu.ServiceLinesEntry.id, order=210) # --------------------------- if not already_populated: def create_quote_status(pk, name, **kwargs): create_if_needed(QuoteStatus, {'pk': pk}, name=name, **kwargs) # Default status create_quote_status(1, pgettext('billing-quote', 'Pending'), order=2) create_quote_status(2, pgettext('billing-quote', 'Accepted'), order=3, won=True) create_quote_status(3, pgettext('billing-quote', 'Rejected'), order=4) create_quote_status(4, pgettext('billing-quote', 'Created'), order=1) # --------------------------- create_if_needed(SettlementTerms, {'pk': 1}, name=_('30 days')) create_if_needed(SettlementTerms, {'pk': 2}, name=_('Cash')) create_if_needed(SettlementTerms, {'pk': 3}, name=_('45 days')) create_if_needed(SettlementTerms, {'pk': 4}, name=_('60 days')) create_if_needed(SettlementTerms, {'pk': 5}, name=_('30 days, end month the 10')) # --------------------------- create_if_needed( AdditionalInformation, {'pk': 1}, name=_('Trainer accreditation'), description= _('being certified trainer courses could be supported by your OPCA' )) # --------------------------- create_bmi = ButtonMenuItem.objects.create_if_needed create_bmi(model=Invoice, button=buttons.GenerateInvoiceNumberButton, order=0) create_bmi(model=Quote, button=buttons.ConvertToInvoiceButton, order=0) create_bmi(model=Quote, button=buttons.ConvertToSalesOrderButton, order=1) create_bmi(model=SalesOrder, button=buttons.ConvertToInvoiceButton, order=0) create_bmi(model=Organisation, button=buttons.AddQuoteButton, order=100) create_bmi(model=Organisation, button=buttons.AddSalesOrderButton, order=101) create_bmi(model=Organisation, button=buttons.AddInvoiceButton, order=102) create_bmi(model=Contact, button=buttons.AddQuoteButton, order=100) create_bmi(model=Contact, button=buttons.AddSalesOrderButton, order=101) create_bmi(model=Contact, button=buttons.AddInvoiceButton, order=102) # --------------------------- create_cbci = CustomBrickConfigItem.objects.create build_cell = EntityCellRegularField.build def build_cells(model, *extra_cells): return [ build_cell(model, 'name'), build_cell(model, 'number'), build_cell(model, 'issuing_date'), build_cell(model, 'expiration_date'), build_cell(model, 'discount'), build_cell(model, 'additional_info'), build_cell(model, 'payment_terms'), build_cell(model, 'currency'), *extra_cells, build_cell(model, 'comment'), build_cell(model, 'description'), # -- build_cell(model, 'created'), build_cell(model, 'modified'), build_cell(model, 'user'), ] cbci_invoice = create_cbci( id='billing-invoice_info', name=_('Invoice information'), content_type=Invoice, cells=build_cells( Invoice, build_cell(Invoice, 'status'), build_cell(Invoice, 'payment_type'), build_cell(Invoice, 'buyers_order_number'), ), ) cbci_c_note = create_cbci( id='billing-creditnote_info', name=_('Credit note information'), content_type=CreditNote, cells=build_cells( CreditNote, build_cell(CreditNote, 'status'), ), ) cbci_quote = create_cbci( id='billing-quote_info', name=_('Quote information'), content_type=Quote, cells=build_cells( Quote, build_cell(Quote, 'status'), build_cell(Quote, 'acceptation_date'), ), ) cbci_s_order = create_cbci( id='billing-salesorder_info', name=_('Salesorder information'), content_type=SalesOrder, cells=build_cells( SalesOrder, build_cell(SalesOrder, 'status'), ), ) cbci_tbase = create_cbci( id='billing-templatebase_info', name=pgettext('billing', 'Template information'), content_type=TemplateBase, cells=build_cells( TemplateBase, EntityCellFunctionField.build(TemplateBase, 'get_verbose_status'), ), ) models_4_blocks = [ (Invoice, cbci_invoice, True), # Boolean -> insert CreditNote block (CreditNote, cbci_c_note, False), (Quote, cbci_quote, True), (SalesOrder, cbci_s_order, True), (TemplateBase, cbci_tbase, False), ] TOP = BrickDetailviewLocation.TOP LEFT = BrickDetailviewLocation.LEFT RIGHT = BrickDetailviewLocation.RIGHT for model, cbci, has_credit_notes in models_4_blocks: data = [ # LEFT { 'brick': cbci.brick_id, 'order': 5 }, { 'brick': core_bricks.CustomFieldsBrick, 'order': 40 }, { 'brick': bricks.BillingPaymentInformationBrick, 'order': 60 }, { 'brick': bricks.BillingPrettyAddressBrick, 'order': 70 }, { 'brick': core_bricks.PropertiesBrick, 'order': 450 }, { 'brick': core_bricks.RelationsBrick, 'order': 500 }, { 'brick': bricks.TargetBrick, 'order': 2, 'zone': RIGHT }, { 'brick': bricks.TotalBrick, 'order': 3, 'zone': RIGHT }, { 'brick': core_bricks.HistoryBrick, 'order': 20, 'zone': RIGHT }, { 'brick': bricks.ProductLinesBrick, 'order': 10, 'zone': TOP }, { 'brick': bricks.ServiceLinesBrick, 'order': 20, 'zone': TOP }, ] if has_credit_notes: data.append({ 'brick': bricks.CreditNotesBrick, 'order': 30, 'zone': TOP }) BrickDetailviewLocation.objects.multi_create( defaults={ 'model': model, 'zone': LEFT }, data=data, ) if apps.is_installed('creme.assistants'): logger.info( 'Assistants app is installed => we use the assistants blocks on detail views' ) from creme.assistants import bricks as a_bricks for t in models_4_blocks: BrickDetailviewLocation.objects.multi_create( defaults={ 'model': t[0], 'zone': RIGHT }, data=[ { 'brick': a_bricks.TodosBrick, 'order': 100 }, { 'brick': a_bricks.MemosBrick, 'order': 200 }, { 'brick': a_bricks.AlertsBrick, 'order': 300 }, { 'brick': a_bricks.UserMessagesBrick, 'order': 400 }, ], ) if apps.is_installed('creme.documents'): # logger.info( # 'Documents app is installed # => we use the documents block on detail views' # ) from creme.documents.bricks import LinkedDocsBrick for t in models_4_blocks: BrickDetailviewLocation.objects.create_if_needed( brick=LinkedDocsBrick, order=600, zone=RIGHT, model=t[0], ) BrickDetailviewLocation.objects.multi_create( defaults={ 'model': Organisation, 'zone': RIGHT }, data=[ { 'brick': bricks.PaymentInformationBrick, 'order': 300, 'zone': LEFT }, { 'brick': bricks.ReceivedInvoicesBrick, 'order': 14 }, { 'brick': bricks.ReceivedQuotesBrick, 'order': 18 }, ], ) # --------------------------- if apps.is_installed('creme.reports'): logger.info( 'Reports app is installed ' '=> we create 2 billing reports, with 3 graphs, and related blocks in home' ) self.create_reports( rt_sub_bill_received, current_year_invoice_filter, current_year_unpaid_invoice_filter, )
def create_cnote_status(pk, name, **kwargs): create_if_needed(CreditNoteStatus, {'pk': pk}, name=name, **kwargs)
def create_order_status(pk, name, **kwargs): create_if_needed(SalesOrderStatus, {'pk': pk}, name=name, **kwargs)
def populate(self): already_populated = RelationType.objects.filter(pk=constants.REL_SUB_BILL_ISSUED).exists() Contact = persons.get_contact_model() Organisation = persons.get_organisation_model() Product = products.get_product_model() Service = products.get_service_model() # --------------------------- # line_entities = [ProductLine, ServiceLine] line_entities = list(lines_registry) RelationType.create((constants.REL_SUB_BILL_ISSUED, _('issued by'), BILLING_MODELS), (constants.REL_OBJ_BILL_ISSUED, _('has issued'), [Organisation]), is_internal=True, minimal_display=(False, True), ) rt_sub_bill_received = \ RelationType.create((constants.REL_SUB_BILL_RECEIVED, _('received by'), BILLING_MODELS), (constants.REL_OBJ_BILL_RECEIVED, _('has received'), [Organisation, Contact]), is_internal=True, minimal_display=(False, True), )[0] RelationType.create((constants.REL_SUB_HAS_LINE, _('had the line'), BILLING_MODELS), (constants.REL_OBJ_HAS_LINE, _('is the line of'), line_entities), is_internal=True, minimal_display=(True, True), ) RelationType.create((constants.REL_SUB_LINE_RELATED_ITEM, _('has the related item'), line_entities), (constants.REL_OBJ_LINE_RELATED_ITEM, _('is the related item of'), [Product, Service]), is_internal=True, ) RelationType.create((constants.REL_SUB_CREDIT_NOTE_APPLIED, _('is used in the billing document'), [CreditNote]), (constants.REL_OBJ_CREDIT_NOTE_APPLIED, _('used the credit note'), [Quote, SalesOrder, Invoice]), is_internal=True, minimal_display=(True, True), ) if apps.is_installed('creme.activities'): logger.info('Activities app is installed => an Invoice/Quote/SalesOrder can be the subject of an Activity') from creme.activities.constants import REL_SUB_ACTIVITY_SUBJECT RelationType.objects.get(pk=REL_SUB_ACTIVITY_SUBJECT) \ .add_subject_ctypes(Invoice, Quote, SalesOrder) # --------------------------- create_if_needed(PaymentTerms, {'pk': 1}, name=_('Deposit'), description=_(r'20% deposit will be required'), is_custom=False, ) # --------------------------- # NB: pk=1 + is_custom=False --> default status (used when a quote is converted in invoice for example) create_if_needed(SalesOrderStatus, {'pk': 1}, name=pgettext('billing-salesorder', 'Issued'), order=1, is_custom=False) # Default status if not already_populated: create_if_needed(SalesOrderStatus, {'pk': 2}, name=pgettext('billing-salesorder', 'Accepted'), order=3) create_if_needed(SalesOrderStatus, {'pk': 3}, name=pgettext('billing-salesorder', 'Rejected'), order=4) create_if_needed(SalesOrderStatus, {'pk': 4}, name=pgettext('billing-salesorder', 'Created'), order=2) # --------------------------- def create_invoice_status(pk, name, **kwargs): create_if_needed(InvoiceStatus, {'pk': pk}, name=name, **kwargs) create_invoice_status(1, pgettext('billing-invoice', 'Draft'), order=1, is_custom=False) # Default status create_invoice_status(2, pgettext('billing-invoice', 'To be sent'), order=2, is_custom=False) if not already_populated: create_invoice_status(3, pgettext('billing-invoice', 'Sent'), order=3, pending_payment=True) create_invoice_status(4, pgettext('billing-invoice', 'Resulted'), order=5) create_invoice_status(5, pgettext('billing-invoice', 'Partly resulted'), order=4, pending_payment=True) create_invoice_status(6, _('Collection'), order=7) create_invoice_status(7, _('Resulted collection'), order=6) create_invoice_status(8, pgettext('billing-invoice', 'Canceled'), order=8) # --------------------------- create_if_needed(CreditNoteStatus, {'pk': 1}, name=pgettext('billing-creditnote', 'Draft'), order=1, is_custom=False) if not already_populated: create_if_needed(CreditNoteStatus, {'pk': 2}, name=pgettext('billing-creditnote', 'Issued'), order=2) create_if_needed(CreditNoteStatus, {'pk': 3}, name=pgettext('billing-creditnote', 'Consumed'), order=3) create_if_needed(CreditNoteStatus, {'pk': 4}, name=pgettext('billing-creditnote', 'Out of date'), order=4) # --------------------------- EntityFilter.create( 'billing-invoices_unpaid', name=_('Invoices unpaid'), model=Invoice, user='******', conditions=[EntityFilterCondition.build_4_field( model=Invoice, operator=EntityFilterCondition.EQUALS, name='status__pending_payment', values=[True], ), ], ) EntityFilter.create( 'billing-invoices_unpaid_late', name=_('Invoices unpaid and late'), model=Invoice, user='******', conditions=[EntityFilterCondition.build_4_field( model=Invoice, operator=EntityFilterCondition.EQUALS, name='status__pending_payment', values=[True], ), EntityFilterCondition.build_4_date( model=Invoice, name='expiration_date', date_range='in_past', ), ], ) current_year_invoice_filter = EntityFilter.create( 'billing-current_year_invoices', name=_('Current year invoices'), model=Invoice, user='******', conditions=[EntityFilterCondition.build_4_date( model=Invoice, name='issuing_date', date_range='current_year', ), ], ) current_year_unpaid_invoice_filter = EntityFilter.create( 'billing-current_year_unpaid_invoices', name=_('Current year and unpaid invoices'), model=Invoice, user='******', conditions=[EntityFilterCondition.build_4_date( model=Invoice, name='issuing_date', date_range='current_year', ), EntityFilterCondition.build_4_field( model=Invoice, operator=EntityFilterCondition.EQUALS, name='status__pending_payment', values=[True], ), ], ) # --------------------------- def create_hf(hf_pk, name, model, status=True): HeaderFilter.create(pk=hf_pk, name=name, model=model, cells_desc=[(EntityCellRegularField, {'name': 'name'}), EntityCellRelation(model=model, rtype=rt_sub_bill_received), (EntityCellRegularField, {'name': 'number'}), (EntityCellRegularField, {'name': 'status'}) if status else None, (EntityCellRegularField, {'name': 'total_no_vat'}), (EntityCellRegularField, {'name': 'issuing_date'}), (EntityCellRegularField, {'name': 'expiration_date'}), ], ) create_hf(constants.DEFAULT_HFILTER_INVOICE, _('Invoice view'), Invoice) create_hf(constants.DEFAULT_HFILTER_QUOTE, _('Quote view'), Quote) create_hf(constants.DEFAULT_HFILTER_ORDER, _('Sales order view'), SalesOrder) create_hf(constants.DEFAULT_HFILTER_CNOTE, _('Credit note view'), CreditNote) create_hf(constants.DEFAULT_HFILTER_TEMPLATE, _('Template view'), TemplateBase, status=False) def create_hf_lines(hf_pk, name, model): build_cell = EntityCellRegularField.build HeaderFilter.create(pk=hf_pk, name=name, model=model, cells_desc=[build_cell(model=model, name='on_the_fly_item'), build_cell(model=model, name='quantity'), build_cell(model=model, name='unit_price'), ] ) create_hf_lines('billing-hg_product_lines', _('Product lines view'), ProductLine) create_hf_lines('billing-hg_service_lines', _('Service lines view'), ServiceLine) # --------------------------- for model in (Invoice, CreditNote, Quote, SalesOrder): SearchConfigItem.create_if_needed(model, ['name', 'number', 'status__name']) for model in (ProductLine, ServiceLine): SearchConfigItem.create_if_needed(model, [], disabled=True) # --------------------------- SettingValue.objects.get_or_create(key_id=setting_keys.payment_info_key.id, defaults={'value': True}) # --------------------------- if not already_populated: create_if_needed(QuoteStatus, {'pk': 1}, name=pgettext('billing-quote', 'Pending'), order=2) # Default status create_if_needed(QuoteStatus, {'pk': 2}, name=pgettext('billing-quote', 'Accepted'), order=3, won=True) create_if_needed(QuoteStatus, {'pk': 3}, name=pgettext('billing-quote', 'Rejected'), order=4) create_if_needed(QuoteStatus, {'pk': 4}, name=pgettext('billing-quote', 'Created'), order=1) # --------------------------- create_if_needed(SettlementTerms, {'pk': 1}, name=_('30 days')) create_if_needed(SettlementTerms, {'pk': 2}, name=_('Cash')) create_if_needed(SettlementTerms, {'pk': 3}, name=_('45 days')) create_if_needed(SettlementTerms, {'pk': 4}, name=_('60 days')) create_if_needed(SettlementTerms, {'pk': 5}, name=_('30 days, end month the 10')) # --------------------------- create_if_needed(AdditionalInformation, {'pk': 1}, name=_('Trainer accreditation'), description=_('being certified trainer courses could be supported by your OPCA') ) # --------------------------- create_bmi = ButtonMenuItem.create_if_needed create_bmi(pk='billing-generate_invoice_number', model=Invoice, button=buttons.GenerateInvoiceNumberButton, order=0) create_bmi(pk='billing-quote_orga_button', model=Organisation, button=buttons.AddQuoteButton, order=100) create_bmi(pk='billing-salesorder_orga_button', model=Organisation, button=buttons.AddSalesOrderButton, order=101) create_bmi(pk='billing-invoice_orga_button', model=Organisation, button=buttons.AddInvoiceButton, order=102) create_bmi(pk='billing-quote_contact_button', model=Contact, button=buttons.AddQuoteButton, order=100) create_bmi(pk='billing-salesorder_contact_button', model=Contact, button=buttons.AddSalesOrderButton, order=101) create_bmi(pk='billing-invoice_contact_button', model=Contact, button=buttons.AddInvoiceButton, order=102) # --------------------------- get_ct = ContentType.objects.get_for_model create_cbci = CustomBrickConfigItem.objects.create build_cell = EntityCellRegularField.build def build_cells(model, *extra_cells): return [ build_cell(model, 'name'), build_cell(model, 'number'), build_cell(model, 'issuing_date'), build_cell(model, 'expiration_date'), build_cell(model, 'discount'), build_cell(model, 'additional_info'), build_cell(model, 'payment_terms'), build_cell(model, 'currency'), ] + list(extra_cells) + [ build_cell(model, 'comment'), # -- build_cell(model, 'created'), build_cell(model, 'modified'), build_cell(model, 'user'), ] cbci_invoice = create_cbci(id='billing-invoice_info', name=_('Invoice information'), content_type=get_ct(Invoice), cells=build_cells(Invoice, build_cell(Invoice, 'status'), build_cell(Invoice, 'payment_type'), ), ) cbci_c_note = create_cbci(id='billing-creditnote_info', name=_('Credit note information'), content_type=get_ct(CreditNote), cells=build_cells(CreditNote, build_cell(CreditNote, 'status')), ) cbci_quote = create_cbci(id='billing-quote_info', name=_('Quote information'), content_type=get_ct(Quote), cells=build_cells(Quote, build_cell(Quote, 'status'), build_cell(Quote, 'acceptation_date'), ), ) cbci_s_order = create_cbci(id='billing-salesorder_info', name=_('Salesorder information'), content_type=get_ct(SalesOrder), cells=build_cells(SalesOrder, build_cell(SalesOrder, 'status')), ) cbci_tbase = create_cbci(id='billing-templatebase_info', name=pgettext('billing', 'Template information'), content_type=get_ct(TemplateBase), cells=build_cells(TemplateBase, EntityCellFunctionField.build(TemplateBase, 'get_verbose_status'), ), ) models_4_blocks = [(Invoice, cbci_invoice, True), # Boolean -> insert CreditNote block (CreditNote, cbci_c_note, False), (Quote, cbci_quote, True), (SalesOrder, cbci_s_order, True), (TemplateBase, cbci_tbase, False), ] create_bdl = BrickDetailviewLocation.create_if_needed TOP = BrickDetailviewLocation.TOP LEFT = BrickDetailviewLocation.LEFT RIGHT = BrickDetailviewLocation.RIGHT for model, cbci, has_credit_notes in models_4_blocks: create_bdl(brick_id=bricks.ProductLinesBrick.id_, order=10, zone=TOP, model=model) create_bdl(brick_id=bricks.ServiceLinesBrick.id_, order=20, zone=TOP, model=model) if has_credit_notes: create_bdl(brick_id=bricks.CreditNotesBrick.id_, order=30, zone=TOP, model=model) create_bdl(brick_id=cbci.generate_id(), order=5, zone=LEFT, model=model) create_bdl(brick_id=core_bricks.CustomFieldsBrick.id_, order=40, zone=LEFT, model=model) create_bdl(brick_id=bricks.BillingPaymentInformationBrick.id_, order=60, zone=LEFT, model=model) create_bdl(brick_id=bricks.BillingPrettyAddressBrick.id_, order=70, zone=LEFT, model=model) create_bdl(brick_id=core_bricks.PropertiesBrick.id_, order=450, zone=LEFT, model=model) create_bdl(brick_id=core_bricks.RelationsBrick.id_, order=500, zone=LEFT, model=model) create_bdl(brick_id=bricks.TargetBrick.id_, order=2, zone=RIGHT, model=model) create_bdl(brick_id=bricks.TotalBrick.id_, order=3, zone=RIGHT, model=model) create_bdl(brick_id=core_bricks.HistoryBrick.id_, order=20, zone=RIGHT, model=model) if apps.is_installed('creme.assistants'): logger.info('Assistants app is installed => we use the assistants blocks on detail views') from creme.assistants.bricks import AlertsBrick, MemosBrick, TodosBrick, UserMessagesBrick for t in models_4_blocks: model = t[0] create_bdl(brick_id=TodosBrick.id_, order=100, zone=RIGHT, model=model) create_bdl(brick_id=MemosBrick.id_, order=200, zone=RIGHT, model=model) create_bdl(brick_id=AlertsBrick.id_, order=300, zone=RIGHT, model=model) create_bdl(brick_id=UserMessagesBrick.id_, order=400, zone=RIGHT, model=model) if apps.is_installed('creme.documents'): # logger.info('Documents app is installed => we use the documents block on detail views') from creme.documents.bricks import LinkedDocsBrick for t in models_4_blocks: create_bdl(brick_id=LinkedDocsBrick.id_, order=600, zone=RIGHT, model=t[0]) create_bdl(brick_id=bricks.PaymentInformationBrick.id_, order=300, zone=LEFT, model=Organisation) create_bdl(brick_id=bricks.ReceivedInvoicesBrick.id_, order=14, zone=RIGHT, model=Organisation) create_bdl(brick_id=bricks.ReceivedQuotesBrick.id_, order=18, zone=RIGHT, model=Organisation) # --------------------------- if apps.is_installed('creme.reports'): logger.info('Reports app is installed => we create 2 billing reports, with 3 graphs, and related blocks in home') self.create_reports(rt_sub_bill_received, current_year_invoice_filter, current_year_unpaid_invoice_filter, )
def populate(self): already_populated = RelationType.objects.filter( pk=constants.REL_SUB_EMPLOYED_BY, ).exists() Contact = persons.get_contact_model() Organisation = persons.get_organisation_model() rt_map = {} for rt_info in [ ( (constants.REL_SUB_EMPLOYED_BY, _('is an employee of'), [Contact]), (constants.REL_OBJ_EMPLOYED_BY, _('employs'), [Organisation]), ), ( ( constants.REL_SUB_CUSTOMER_SUPPLIER, _('is a customer of'), [Contact, Organisation], ), ( constants.REL_OBJ_CUSTOMER_SUPPLIER, _('is a supplier of'), [Contact, Organisation], ), ), ( (constants.REL_SUB_MANAGES, _('manages'), [Contact]), (constants.REL_OBJ_MANAGES, _('managed by'), [Organisation]), ), ( (constants.REL_SUB_PROSPECT, _('is a prospect of'), [Contact, Organisation]), (constants.REL_OBJ_PROSPECT, _('has as prospect'), [Contact, Organisation]), ), ( (constants.REL_SUB_SUSPECT, _('is a suspect of'), [Contact, Organisation]), (constants.REL_OBJ_SUSPECT, _('has as suspect'), [Contact, Organisation]), ), ( (constants.REL_SUB_PARTNER, _('is a partner of'), [Contact, Organisation]), (constants.REL_OBJ_PARTNER, _('has as partner'), [Contact, Organisation]), ), ( ( constants.REL_SUB_INACTIVE, _('is an inactive customer of'), [Contact, Organisation], ), ( constants.REL_OBJ_INACTIVE, _('has as inactive customer'), [Contact, Organisation], ), ), ( (constants.REL_SUB_SUBSIDIARY, _('has as subsidiary'), [Organisation]), (constants.REL_OBJ_SUBSIDIARY, _('is a subsidiary of'), [Organisation]), ), ( (constants.REL_SUB_COMPETITOR, _('is a competitor of'), [Contact, Organisation]), (constants.REL_OBJ_COMPETITOR, _('has as competitor'), [Contact, Organisation]), ), ]: rt, sym_rt = RelationType.create(*rt_info) rt_map[rt.id] = rt rt_map[sym_rt.id] = sym_rt get_rtype = RelationType.objects.get get_rtype(pk=core_constants.REL_SUB_HAS).add_subject_ctypes( Contact, Organisation) get_rtype( pk=core_constants.REL_OBJ_HAS).add_subject_ctypes(Organisation) # --------------------------- EntityFilter.objects.smart_update_or_create( constants.FILTER_MANAGED_ORGA, name=_('Managed by creme'), model=Organisation, user='******', conditions=[ condition_handler.RegularFieldConditionHandler.build_condition( model=Organisation, operator=operators.EqualsOperator, field_name='is_managed', values=[True], ), ], ) EntityFilter.objects.smart_update_or_create( constants.FILTER_CONTACT_ME, name=_('Me'), model=Contact, user='******', conditions=[ condition_handler.RegularFieldConditionHandler.build_condition( model=Contact, operator=operators.EqualsOperator, field_name='is_user', values=[operands.CurrentUserOperand.type_id], ), ], ) # --------------------------- create_hf = HeaderFilter.objects.create_if_needed create_hf( pk=constants.DEFAULT_HFILTER_CONTACT, model=Contact, name=_('Contact view'), cells_desc=[ (EntityCellRegularField, { 'name': 'last_name' }), (EntityCellRegularField, { 'name': 'first_name' }), (EntityCellRegularField, { 'name': 'phone' }), (EntityCellRegularField, { 'name': 'email' }), (EntityCellRegularField, { 'name': 'user' }), EntityCellRelation( model=Contact, rtype=rt_map[constants.REL_SUB_EMPLOYED_BY]), ], ) create_hf( pk=constants.DEFAULT_HFILTER_ORGA, model=Organisation, name=_('Organisation view'), cells_desc=[ (EntityCellRegularField, { 'name': 'name' }), (EntityCellRegularField, { 'name': 'phone' }), (EntityCellRegularField, { 'name': 'user' }), EntityCellRelation(model=Organisation, rtype=rt_map[constants.REL_OBJ_MANAGES]), ], ) create_hf( pk=constants.DEFAULT_HFILTER_ORGA_CUSTOMERS, model=Organisation, name=_('Prospect/Suspect view'), cells_desc=[ (EntityCellRegularField, { 'name': 'name' }), (EntityCellRegularField, { 'name': 'sector' }), (EntityCellRegularField, { 'name': 'phone' }), (EntityCellRegularField, { 'name': 'email' }), (EntityCellRegularField, { 'name': 'user' }), EntityCellRelation( model=Organisation, rtype=rt_map[constants.REL_SUB_CUSTOMER_SUPPLIER], ), EntityCellRelation( model=Organisation, rtype=rt_map[constants.REL_SUB_PROSPECT], ), EntityCellRelation( model=Organisation, rtype=rt_map[constants.REL_SUB_SUSPECT], ), ], ) # --------------------------- creation_only_groups_desc = [ { 'name': _('Properties'), 'cells': [ ( EntityCellCustomFormSpecial, { 'name': EntityCellCustomFormSpecial.CREME_PROPERTIES }, ), ], }, { 'name': _('Relationships'), 'cells': [ ( EntityCellCustomFormSpecial, { 'name': EntityCellCustomFormSpecial.RELATIONS }, ), ], }, ] description_group_desc = { 'name': _('Description'), 'layout': LAYOUT_DUAL_SECOND, 'cells': [ (EntityCellRegularField, { 'name': 'description' }), ], } cfields_group_desc = { 'name': _('Custom fields'), 'layout': LAYOUT_DUAL_SECOND, 'cells': [ ( EntityCellCustomFormSpecial, { 'name': EntityCellCustomFormSpecial.REMAINING_CUSTOMFIELDS }, ), ], } contact_groups_desc = [ { 'name': _('General information'), 'layout': LAYOUT_DUAL_FIRST, 'cells': [ (EntityCellRegularField, { 'name': 'user' }), (EntityCellRegularField, { 'name': 'civility' }), (EntityCellRegularField, { 'name': 'last_name' }), (EntityCellRegularField, { 'name': 'first_name' }), (EntityCellRegularField, { 'name': 'position' }), (EntityCellRegularField, { 'name': 'full_position' }), (EntityCellRegularField, { 'name': 'sector' }), (EntityCellRegularField, { 'name': 'birthday' }), (EntityCellRegularField, { 'name': 'image' }), ( EntityCellCustomFormSpecial, { 'name': EntityCellCustomFormSpecial.REMAINING_REGULARFIELDS }, ), ], }, description_group_desc, { 'name': _('Contact details'), 'layout': LAYOUT_DUAL_SECOND, 'cells': [ (EntityCellRegularField, { 'name': 'skype' }), (EntityCellRegularField, { 'name': 'phone' }), (EntityCellRegularField, { 'name': 'mobile' }), (EntityCellRegularField, { 'name': 'fax' }), (EntityCellRegularField, { 'name': 'email' }), (EntityCellRegularField, { 'name': 'url_site' }), ], }, cfields_group_desc, AddressesGroup(model=Contact), ] orga_groups_desc = [ { 'name': _('General information'), 'layout': LAYOUT_DUAL_FIRST, 'cells': [ (EntityCellRegularField, { 'name': 'user' }), (EntityCellRegularField, { 'name': 'name' }), (EntityCellRegularField, { 'name': 'phone' }), (EntityCellRegularField, { 'name': 'fax' }), (EntityCellRegularField, { 'name': 'email' }), (EntityCellRegularField, { 'name': 'url_site' }), (EntityCellRegularField, { 'name': 'sector' }), (EntityCellRegularField, { 'name': 'legal_form' }), (EntityCellRegularField, { 'name': 'staff_size' }), (EntityCellRegularField, { 'name': 'capital' }), (EntityCellRegularField, { 'name': 'annual_revenue' }), (EntityCellRegularField, { 'name': 'siren' }), (EntityCellRegularField, { 'name': 'naf' }), (EntityCellRegularField, { 'name': 'siret' }), (EntityCellRegularField, { 'name': 'rcs' }), (EntityCellRegularField, { 'name': 'tvaintra' }), (EntityCellRegularField, { 'name': 'subject_to_vat' }), (EntityCellRegularField, { 'name': 'creation_date' }), (EntityCellRegularField, { 'name': 'image' }), ( EntityCellCustomFormSpecial, { 'name': EntityCellCustomFormSpecial.REMAINING_REGULARFIELDS }, ), ], }, description_group_desc, cfields_group_desc, AddressesGroup(model=Organisation), ] CustomFormConfigItem.objects.create_if_needed( descriptor=custom_forms.CONTACT_CREATION_CFORM, groups_desc=[ *contact_groups_desc, *creation_only_groups_desc, ], ) CustomFormConfigItem.objects.create_if_needed( descriptor=custom_forms.CONTACT_EDITION_CFORM, groups_desc=contact_groups_desc, ) CustomFormConfigItem.objects.create_if_needed( descriptor=custom_forms.ORGANISATION_CREATION_CFORM, groups_desc=[ *orga_groups_desc, *creation_only_groups_desc, ], ) CustomFormConfigItem.objects.create_if_needed( descriptor=custom_forms.ORGANISATION_EDITION_CFORM, groups_desc=orga_groups_desc, ) # --------------------------- create_sci = SearchConfigItem.objects.create_if_needed create_sci(Contact, ['last_name', 'first_name', 'phone', 'mobile', 'email']) create_sci( Organisation, ['name', 'phone', 'email', 'sector__title', 'legal_form__title']) # --------------------------- # TODO: move to "not already_populated" section in creme2.4 if not MenuConfigItem.objects.filter( entry_id__startswith='persons-').exists(): directory = MenuConfigItem.objects.get_or_create( entry_id=ContainerEntry.id, entry_data={'label': _('Directory')}, defaults={'order': 20}, )[0] create_mitem = MenuConfigItem.objects.create create_mitem(entry_id=menu.OrganisationsEntry.id, order=10, parent=directory) create_mitem(entry_id=menu.ContactsEntry.id, order=20, parent=directory) create_mitem(entry_id=menu.CustomersEntry.id, order=30, parent=directory) creations = MenuConfigItem.objects.filter( entry_id=ContainerEntry.id, entry_data={ 'label': _('+ Creation') }, ).first() if creations is not None: create_mitem( entry_id=menu.OrganisationCreationEntry.id, order=10, parent=creations, ) create_mitem( entry_id=menu.ContactCreationEntry.id, order=20, parent=creations, ) # --------------------------- if not already_populated: create_if_needed(Civility, {'pk': 1}, title=_('Madam'), shortcut=_('Mrs.')) create_if_needed(Civility, {'pk': 2}, title=_('Miss'), shortcut=_('Ms.')) create_if_needed(Civility, {'pk': 3}, title=_('Mister'), shortcut=_('Mr.')) create_if_needed(Civility, {'pk': 4}, title=_('N/A'), shortcut='') # --------------------------- # TODO: add relation to admin ???? if not Organisation.objects.exists(): Organisation.objects.create( user=get_user_model().objects.get_admin(), name=_('ReplaceByYourSociety'), is_managed=True, uuid=constants.UUID_FIRST_ORGA, ) # --------------------------- create_if_needed(Position, {'pk': 1}, title=_('CEO')) create_if_needed(Position, {'pk': 2}, title=_('Secretary')) create_if_needed(Position, {'pk': 3}, title=_('Technician')) # --------------------------- create_if_needed(Sector, {'pk': 1}, title=_('Food Industry')) create_if_needed(Sector, {'pk': 2}, title=_('Industry')) create_if_needed(Sector, {'pk': 3}, title=_('Software')) create_if_needed(Sector, {'pk': 4}, title=_('Telecom')) create_if_needed(Sector, {'pk': 5}, title=_('Restoration')) # --------------------------- # TODO: depend on the country no ?? create_if_needed(LegalForm, {'pk': 1}, title='SARL') create_if_needed(LegalForm, {'pk': 2}, title='Association loi 1901') create_if_needed(LegalForm, {'pk': 3}, title='SA') create_if_needed(LegalForm, {'pk': 4}, title='SAS') # --------------------------- create_if_needed(StaffSize, {'pk': 1}, size='1 - 5', order=1) create_if_needed(StaffSize, {'pk': 2}, size='6 - 10', order=2) create_if_needed(StaffSize, {'pk': 3}, size='11 - 50', order=3) create_if_needed(StaffSize, {'pk': 4}, size='51 - 100', order=4) create_if_needed(StaffSize, {'pk': 5}, size='100 - 500', order=5) create_if_needed(StaffSize, {'pk': 6}, size='> 500', order=6) # --------------------------- create_bmi = ButtonMenuItem.objects.create_if_needed create_bmi(model=Contact, button=buttons.BecomeCustomerButton, order=20) create_bmi(model=Contact, button=buttons.BecomeProspectButton, order=21) create_bmi(model=Contact, button=buttons.BecomeSuspectButton, order=22) create_bmi(model=Contact, button=buttons.BecomeInactiveButton, order=24) create_bmi(model=Organisation, button=buttons.BecomeCustomerButton, order=20) create_bmi(model=Organisation, button=buttons.BecomeProspectButton, order=21) create_bmi(model=Organisation, button=buttons.BecomeSuspectButton, order=22) create_bmi(model=Organisation, button=buttons.BecomeInactiveButton, order=23) create_bmi(model=Organisation, button=buttons.BecomeSupplierButton, order=24) create_bmi(model=Organisation, button=buttons.AddLinkedContactButton, order=25) # Populate bricks ------------------ create_rbi = RelationBrickItem.objects.create_if_needed rbi_1 = create_rbi(constants.REL_SUB_CUSTOMER_SUPPLIER) rbi_2 = create_rbi(constants.REL_OBJ_CUSTOMER_SUPPLIER) create_cbci = CustomBrickConfigItem.objects.create build_cell = EntityCellRegularField.build # cbci_orga_1 = create_cbci( id='persons-organisation_main_info', name=_('Organisation information'), content_type=Organisation, cells=[ build_cell(Organisation, 'name'), build_cell(Organisation, 'is_managed'), build_cell(Organisation, 'staff_size'), build_cell(Organisation, 'legal_form'), build_cell(Organisation, 'sector'), build_cell(Organisation, 'capital'), build_cell(Organisation, 'siren'), build_cell(Organisation, 'naf'), build_cell(Organisation, 'siret'), build_cell(Organisation, 'rcs'), build_cell(Organisation, 'tvaintra'), build_cell(Organisation, 'subject_to_vat'), build_cell(Organisation, 'annual_revenue'), build_cell(Organisation, 'creation_date'), build_cell(Organisation, 'image'), # -- build_cell(Organisation, 'description'), # -- build_cell(Organisation, 'created'), build_cell(Organisation, 'modified'), build_cell(Organisation, 'user'), ], ) # cbci_orga_2 = create_cbci( id='persons-organisation_details', name=_('Organisation details'), content_type=Organisation, cells=[ build_cell(Organisation, 'phone'), build_cell(Organisation, 'fax'), build_cell(Organisation, 'email'), build_cell(Organisation, 'url_site'), ], ) cbci_orga_extra = create_cbci( id='persons-organisation_complementary', name=_('Organisation complementary information'), content_type=Organisation, cells=[ build_cell(Organisation, 'staff_size'), build_cell(Organisation, 'sector'), build_cell(Organisation, 'capital'), build_cell(Organisation, 'siren'), build_cell(Organisation, 'naf'), build_cell(Organisation, 'siret'), build_cell(Organisation, 'rcs'), build_cell(Organisation, 'tvaintra'), build_cell(Organisation, 'subject_to_vat'), build_cell(Organisation, 'annual_revenue'), build_cell(Organisation, 'creation_date'), build_cell(Organisation, 'image'), # -- build_cell(Organisation, 'description'), # -- build_cell(Organisation, 'fax'), build_cell(Organisation, 'email'), build_cell(Organisation, 'url_site'), ], ) HAT = BrickDetailviewLocation.HAT LEFT = BrickDetailviewLocation.LEFT RIGHT = BrickDetailviewLocation.RIGHT BrickDetailviewLocation.objects.multi_create( defaults={ 'model': Organisation, 'zone': LEFT }, data=[ { 'brick': bricks.OrganisationCardHatBrick, 'order': 1, 'zone': HAT }, { 'brick': cbci_orga_extra.brick_id, 'order': 5 }, { 'brick': core_bricks.CustomFieldsBrick, 'order': 40 }, { 'brick': bricks.PrettyAddressesBrick, 'order': 50 }, { 'brick': bricks.PrettyOtherAddressesBrick, 'order': 60 }, { 'brick': bricks.ManagersBrick, 'order': 100 }, { 'brick': bricks.EmployeesBrick, 'order': 120 }, { 'brick': core_bricks.PropertiesBrick, 'order': 450 }, { 'brick': core_bricks.RelationsBrick, 'order': 500 }, { 'brick': rbi_1.brick_id, 'order': 5, 'zone': RIGHT }, { 'brick': rbi_2.brick_id, 'order': 10, 'zone': RIGHT }, { 'brick': core_bricks.HistoryBrick, 'order': 30, 'zone': RIGHT }, ], ) create_cbci( id='persons-contact_main_info', name=_('Contact information'), content_type=Contact, cells=[ build_cell(Contact, 'civility'), build_cell(Contact, 'first_name'), build_cell(Contact, 'last_name'), build_cell(Contact, 'sector'), build_cell(Contact, 'position'), build_cell(Contact, 'full_position'), build_cell(Contact, 'is_user'), build_cell(Contact, 'birthday'), build_cell(Contact, 'image'), # -- build_cell(Contact, 'description'), # -- build_cell(Contact, 'created'), build_cell(Contact, 'modified'), build_cell(Contact, 'user'), ], ) create_cbci( id='persons-contact_details', name=_('Contact details'), content_type=Contact, cells=[ build_cell(Contact, 'phone'), build_cell(Contact, 'mobile'), build_cell(Contact, 'fax'), build_cell(Contact, 'email'), build_cell(Contact, 'url_site'), build_cell(Contact, 'skype'), ], ) cbci_contact_extra = create_cbci( id='persons-contact_complementary', name=_('Contact complementary information'), content_type=Contact, cells=[ build_cell(Contact, 'sector'), build_cell(Contact, 'full_position'), build_cell(Contact, 'birthday'), build_cell(Contact, 'image'), # -- build_cell(Contact, 'description'), # -- build_cell(Contact, 'fax'), build_cell(Contact, 'url_site'), build_cell(Contact, 'skype'), ], ) BrickDetailviewLocation.objects.multi_create( defaults={ 'model': Contact, 'zone': LEFT }, data=[ { 'brick': bricks.ContactCardHatBrick, 'order': 1, 'zone': HAT }, { 'brick': cbci_contact_extra.brick_id, 'order': 30 }, { 'brick': core_bricks.CustomFieldsBrick, 'order': 40 }, { 'brick': bricks.PrettyAddressesBrick, 'order': 50 }, { 'brick': bricks.PrettyOtherAddressesBrick, 'order': 60 }, { 'brick': core_bricks.PropertiesBrick, 'order': 450 }, { 'brick': core_bricks.RelationsBrick, 'order': 500 }, { 'brick': core_bricks.HistoryBrick, 'order': 20, 'zone': RIGHT }, ], ) if apps.is_installed('creme.assistants'): logger.info( 'Assistants app is installed' ' => we use the assistants blocks on detail views and portal' ) from creme.assistants import bricks as a_bricks for model in (Contact, Organisation): BrickDetailviewLocation.objects.multi_create( defaults={ 'model': model, 'zone': RIGHT }, data=[ { 'brick': a_bricks.TodosBrick, 'order': 100 }, { 'brick': a_bricks.MemosBrick, 'order': 200 }, { 'brick': a_bricks.AlertsBrick, 'order': 300 }, { 'brick': a_bricks.UserMessagesBrick, 'order': 500 }, ], ) if apps.is_installed('creme.documents'): # logger.info('Documents app is installed # => we use the documents block on detail views') from creme.documents.bricks import LinkedDocsBrick BrickDetailviewLocation.objects.multi_create( defaults={ 'brick': LinkedDocsBrick, 'order': 600, 'zone': RIGHT }, data=[ { 'model': Contact }, { 'model': Organisation }, ], ) if apps.is_installed('creme.activities'): BrickHomeLocation.objects.create( brick_id=bricks.NeglectedOrganisationsBrick.id_, order=15, )
def populate(self, *args, **kwargs): PollCampaign = polls.get_pollcampaign_model() PollForm = polls.get_pollform_model() PollReply = polls.get_pollreply_model() Contact = persons.get_contact_model() Organisation = persons.get_organisation_model() create_hf = HeaderFilter.objects.create_if_needed create_hf( pk=constants.DEFAULT_HFILTER_PFORM, model=PollForm, name=_('Form view'), cells_desc=[(EntityCellRegularField, { 'name': 'name' })], ) create_hf( pk=constants.DEFAULT_HFILTER_PREPLY, model=PollReply, name=_('Reply view'), cells_desc=[ (EntityCellRegularField, { 'name': 'name' }), (EntityCellRegularField, { 'name': 'pform' }), (EntityCellRegularField, { 'name': 'person' }), ], ) create_hf( pk=constants.DEFAULT_HFILTER_PCAMPAIGN, model=PollCampaign, name=_('Campaign view'), cells_desc=[ (EntityCellRegularField, { 'name': 'name' }), (EntityCellRegularField, { 'name': 'due_date' }), (EntityCellRegularField, { 'name': 'segment' }), ], ) # --------------------------- def build_custom_form_items(creation_descriptor, edition_descriptor, field_names): base_groups_desc = [ { 'name': _('General information'), 'cells': [ *((EntityCellRegularField, { 'name': fname }) for fname in field_names), ( EntityCellCustomFormSpecial, { 'name': EntityCellCustomFormSpecial. REMAINING_REGULARFIELDS }, ), ], }, { 'name': _('Description'), 'cells': [ (EntityCellRegularField, { 'name': 'description' }), ], }, { 'name': _('Custom fields'), 'cells': [ ( EntityCellCustomFormSpecial, { 'name': EntityCellCustomFormSpecial. REMAINING_CUSTOMFIELDS }, ), ], }, ] CustomFormConfigItem.objects.create_if_needed( descriptor=creation_descriptor, groups_desc=[ *base_groups_desc, { 'name': _('Properties'), 'cells': [ ( EntityCellCustomFormSpecial, { 'name': EntityCellCustomFormSpecial. CREME_PROPERTIES }, ), ], }, { 'name': _('Relationships'), 'cells': [ ( EntityCellCustomFormSpecial, { 'name': EntityCellCustomFormSpecial.RELATIONS }, ), ], }, ], ) CustomFormConfigItem.objects.create_if_needed( descriptor=edition_descriptor, groups_desc=base_groups_desc, ) build_custom_form_items( creation_descriptor=custom_forms.CAMPAIGN_CREATION_CFORM, edition_descriptor=custom_forms.CAMPAIGN_EDITION_CFORM, field_names=[ 'user', 'name', 'goal', 'start', 'due_date', 'segment', 'expected_count', ], ) build_custom_form_items( creation_descriptor=custom_forms.PFORM_CREATION_CFORM, edition_descriptor=custom_forms.PFORM_EDITION_CFORM, field_names=['user', 'name', 'type'], ) # --------------------------- create_searchconf = SearchConfigItem.objects.create_if_needed create_searchconf(PollForm, ['name']) create_searchconf(PollReply, ['name']) create_searchconf(PollCampaign, ['name']) # --------------------------- # NB: no straightforward way to test that this populate script has not been already run if not PollType.objects.exists(): create_if_needed(PollType, {'pk': 1}, name=_('Survey')) create_if_needed(PollType, {'pk': 2}, name=_('Monitoring')) create_if_needed(PollType, {'pk': 3}, name=_('Assessment')) # --------------------------- # TODO: move to "not already_populated" section in creme2.4 if not MenuConfigItem.objects.filter( entry_id__startswith='polls-').exists(): container = MenuConfigItem.objects.get_or_create( entry_id=ContainerEntry.id, entry_data={'label': _('Tools')}, defaults={'order': 100}, )[0] create_mitem = partial(MenuConfigItem.objects.create, parent=container) create_mitem( entry_id=Separator1Entry.id, entry_data={'label': _('Polls')}, order=300, ) create_mitem(entry_id=menu.PollFormsEntry.id, order=305) create_mitem(entry_id=menu.PollRepliesEntry.id, order=310) create_mitem(entry_id=menu.PollCampaignsEntry.id, order=315) # --------------------------- # NB: no straightforward way to test that this populate script has not been already run if not BrickDetailviewLocation.objects.filter_for_model( PollForm).exists(): TOP = BrickDetailviewLocation.TOP LEFT = BrickDetailviewLocation.LEFT RIGHT = BrickDetailviewLocation.RIGHT BrickDetailviewLocation.objects.multi_create( defaults={ 'model': PollForm, 'zone': LEFT }, data=[ { 'brick': bricks.PollFormLinesBrick, 'order': 5, 'zone': TOP }, { 'order': 5 }, { 'brick': core_bricks.CustomFieldsBrick, 'order': 40 }, { 'brick': core_bricks.PropertiesBrick, 'order': 450 }, { 'brick': core_bricks.RelationsBrick, 'order': 500 }, { 'brick': bricks.PollRepliesBrick, 'order': 5, 'zone': RIGHT }, { 'brick': core_bricks.HistoryBrick, 'order': 20, 'zone': RIGHT }, ], ) BrickDetailviewLocation.objects.multi_create( defaults={ 'model': PollReply, 'zone': LEFT }, data=[ { 'brick': bricks.PollReplyLinesBrick, 'order': 5, 'zone': TOP }, { 'order': 5 }, { 'brick': core_bricks.CustomFieldsBrick, 'order': 40 }, { 'brick': core_bricks.PropertiesBrick, 'order': 450 }, { 'brick': core_bricks.RelationsBrick, 'order': 500 }, { 'brick': core_bricks.HistoryBrick, 'order': 20, 'zone': RIGHT }, ], ) BrickDetailviewLocation.objects.multi_create( defaults={ 'model': PollCampaign, 'zone': LEFT }, data=[ { 'order': 5 }, { 'brick': core_bricks.CustomFieldsBrick, 'order': 40 }, { 'brick': core_bricks.PropertiesBrick, 'order': 450 }, { 'brick': core_bricks.RelationsBrick, 'order': 500 }, { 'brick': bricks.PollCampaignRepliesBrick, 'order': 5, 'zone': RIGHT }, { 'brick': core_bricks.HistoryBrick, 'order': 20, 'zone': RIGHT }, ], ) BrickDetailviewLocation.objects.multi_create( defaults={ 'brick': bricks.PersonPollRepliesBrick, 'order': 500, 'zone': RIGHT }, data=[{ 'model': Contact }, { 'model': Organisation }], ) if apps.is_installed('creme.assistants'): logger.info('Assistants app is installed' ' => we use the assistants blocks on detail view') from creme.assistants import bricks as a_bricks for model in (PollForm, PollReply, PollCampaign): BrickDetailviewLocation.objects.multi_create( defaults={ 'model': model, 'zone': RIGHT }, data=[ { 'brick': a_bricks.TodosBrick, 'order': 100 }, { 'brick': a_bricks.MemosBrick, 'order': 200 }, { 'brick': a_bricks.AlertsBrick, 'order': 300 }, { 'brick': a_bricks.UserMessagesBrick, 'order': 400 }, ], ) if apps.is_installed('creme.documents'): # logger.info('Documents app is installed # => we use the documents block on detail views') from creme.documents.bricks import LinkedDocsBrick BrickDetailviewLocation.objects.multi_create( defaults={ 'brick': LinkedDocsBrick, 'order': 600, 'zone': RIGHT }, data=[{ 'model': m } for m in (PollForm, PollReply, PollCampaign)], )
def populate(self): already_populated = RelationType.objects.filter( pk=constants.REL_SUB_RELATED_2_DOC).exists() Document = get_document_model() Folder = get_folder_model() RelationType.create( (constants.REL_SUB_RELATED_2_DOC, _(u'related to the document')), (constants.REL_OBJ_RELATED_2_DOC, _(u'document related to'), [Document])) # --------------------------- # TODO: pk string (or UUID) (+ move DOCUMENTS_FROM_EMAILS in 'emails' app) ?? entities_cat = create_if_needed( FolderCategory, {'pk': constants.DOCUMENTS_FROM_ENTITIES}, name=str(constants.DOCUMENTS_FROM_ENTITIES_NAME), is_custom=False) create_if_needed(FolderCategory, {'pk': constants.DOCUMENTS_FROM_EMAILS}, name=str(constants.DOCUMENTS_FROM_EMAILS_NAME), is_custom=False) # TODO: created by 'products' & 'persons' app ? create_doc_cat = DocumentCategory.objects.get_or_create create_doc_cat(uuid=constants.UUID_DOC_CAT_IMG_PRODUCT, defaults={ 'name': _(u'Product image'), 'is_custom': False, }) create_doc_cat(uuid=constants.UUID_DOC_CAT_IMG_ORGA, defaults={ 'name': _(u'Organisation logo'), 'is_custom': False, }) create_doc_cat(uuid=constants.UUID_DOC_CAT_IMG_CONTACT, defaults={ 'name': _(u'Contact photograph'), 'is_custom': False, }) # --------------------------- user_qs = get_user_model().objects.order_by('id') user = user_qs.filter(is_superuser=True, is_staff=False).first() or \ user_qs.filter(is_superuser=True).first() or \ user_qs[0] if not folder_model_is_custom(): get_create_folder = Folder.objects.get_or_create get_create_folder( uuid=constants.UUID_FOLDER_RELATED2ENTITIES, defaults={ 'user': user, 'title': 'Creme', 'category': entities_cat, 'description': _(u'Folder containing all the documents related to entities' ), }) get_create_folder(uuid=constants.UUID_FOLDER_IMAGES, defaults={ 'user': user, 'title': _(u'Images'), }) # --------------------------- HeaderFilter.create( pk=constants.DEFAULT_HFILTER_DOCUMENT, model=Document, name=_(u'Document view'), cells_desc=[ (EntityCellRegularField, { 'name': 'title' }), # (EntityCellRegularField, {'name': 'folder__title'}), (EntityCellRegularField, { 'name': 'linked_folder__title' }), (EntityCellRegularField, { 'name': 'mime_type' }), ]) HeaderFilter.create(pk=constants.DEFAULT_HFILTER_FOLDER, model=Folder, name=_(u'Folder view'), cells_desc=[ (EntityCellRegularField, { 'name': 'title' }), (EntityCellRegularField, { 'name': 'description' }), (EntityCellRegularField, { 'name': 'category' }), ]) # --------------------------- EntityFilter.create( constants.EFILTER_IMAGES, name=_(u'Images'), model=Document, is_custom=False, user='******', conditions=[ EntityFilterCondition.build_4_field( model=Document, operator=EntityFilterCondition.STARTSWITH, name='mime_type__name', values=[constants.MIMETYPE_PREFIX_IMG], ), ], ) # --------------------------- create_sci = SearchConfigItem.create_if_needed # create_sci(Document, ['title', 'description', 'folder__title', 'categories__name']) create_sci(Document, [ 'title', 'description', 'linked_folder__title', 'categories__name' ]) create_sci(Folder, ['title', 'description', 'category__name']) # --------------------------- if not already_populated: LEFT = BrickDetailviewLocation.LEFT RIGHT = BrickDetailviewLocation.RIGHT create_bdl = BrickDetailviewLocation.create_if_needed BrickDetailviewLocation.create_4_model_brick(order=5, zone=LEFT, model=Folder) create_bdl(brick_id=core_bricks.CustomFieldsBrick.id_, order=40, zone=LEFT, model=Folder) create_bdl(brick_id=bricks.ChildFoldersBrick.id_, order=50, zone=LEFT, model=Folder) create_bdl(brick_id=bricks.FolderDocsBrick.id_, order=60, zone=LEFT, model=Folder) create_bdl(brick_id=core_bricks.PropertiesBrick.id_, order=450, zone=LEFT, model=Folder) create_bdl(brick_id=core_bricks.RelationsBrick.id_, order=500, zone=LEFT, model=Folder) create_bdl(brick_id=core_bricks.HistoryBrick.id_, order=20, zone=RIGHT, model=Folder) if apps.is_installed('creme.assistants'): logger.info( 'Assistants app is installed => we use the assistants blocks on detail view' ) from creme.assistants import bricks as a_bricks create_bdl(brick_id=a_bricks.TodosBrick.id_, order=100, zone=RIGHT, model=Folder) create_bdl(brick_id=a_bricks.MemosBrick.id_, order=200, zone=RIGHT, model=Folder) create_bdl(brick_id=a_bricks.AlertsBrick.id_, order=300, zone=RIGHT, model=Folder) create_bdl(brick_id=a_bricks.UserMessagesBrick.id_, order=400, zone=RIGHT, model=Folder)
def populate(self): already_populated = RelationType.objects.filter( pk=constants.REL_SUB_SOLD).exists() Act = commercial.get_act_model() ActObjectivePattern = commercial.get_pattern_model() Strategy = commercial.get_strategy_model() Contact = persons.get_contact_model() Organisation = persons.get_organisation_model() Product = products.get_product_model() Service = products.get_service_model() RelationType.create( (constants.REL_SUB_SOLD, _('has sold'), [Contact, Organisation]), (constants.REL_OBJ_SOLD, _('has been sold by'), [Product, Service ]), ) complete_goal_models = {*creme_registry.iter_entity_models()} complete_goal_models.discard(Strategy) if apps.is_installed('creme.billing'): from creme import billing from creme.billing.registry import lines_registry complete_goal_models.discard(billing.get_credit_note_model()) complete_goal_models.discard(billing.get_template_base_model()) complete_goal_models.difference_update(lines_registry) RelationType.create( ( constants.REL_SUB_COMPLETE_GOAL, _('completes a goal of the commercial action'), complete_goal_models, ), ( constants.REL_OBJ_COMPLETE_GOAL, _('is completed thanks to'), [Act], ), ) # --------------------------- CremePropertyType.create(constants.PROP_IS_A_SALESMAN, _('is a salesman'), [Contact]) # --------------------------- MarketSegment.objects.get_or_create( property_type=None, defaults={'name': _('All the organisations')}, ) # --------------------------- for i, title in enumerate( [_('Phone calls'), _('Show'), _('Demo')], start=1): create_if_needed(ActType, {'pk': i}, title=title, is_custom=False) # --------------------------- create_hf = HeaderFilter.objects.create_if_needed create_hf( pk=constants.DEFAULT_HFILTER_ACT, model=Act, name=_('Com Action view'), cells_desc=[ (EntityCellRegularField, { 'name': 'name' }), (EntityCellRegularField, { 'name': 'expected_sales' }), (EntityCellRegularField, { 'name': 'due_date' }), ], ) create_hf( pk=constants.DEFAULT_HFILTER_STRATEGY, model=Strategy, name=_('Strategy view'), cells_desc=[(EntityCellRegularField, { 'name': 'name' })], ) create_hf( pk=constants.DEFAULT_HFILTER_PATTERN, model=ActObjectivePattern, name=_('Objective pattern view'), cells_desc=[ (EntityCellRegularField, { 'name': 'name' }), (EntityCellRegularField, { 'name': 'segment' }), ], ) # --------------------------- def build_custom_form_items(creation_descriptor, edition_descriptor, field_names): base_groups_desc = [ { 'name': _('General information'), 'layout': LAYOUT_DUAL_FIRST, 'cells': [ *((EntityCellRegularField, { 'name': fname }) for fname in field_names), ( EntityCellCustomFormSpecial, { 'name': EntityCellCustomFormSpecial. REMAINING_REGULARFIELDS }, ), ], }, { 'name': _('Description'), 'layout': LAYOUT_DUAL_SECOND, 'cells': [ (EntityCellRegularField, { 'name': 'description' }), ], }, { 'name': _('Custom fields'), 'layout': LAYOUT_DUAL_SECOND, 'cells': [ ( EntityCellCustomFormSpecial, { 'name': EntityCellCustomFormSpecial. REMAINING_CUSTOMFIELDS }, ), ], }, ] CustomFormConfigItem.objects.create_if_needed( descriptor=creation_descriptor, groups_desc=[ *base_groups_desc, { 'name': _('Properties'), 'cells': [ ( EntityCellCustomFormSpecial, { 'name': EntityCellCustomFormSpecial. CREME_PROPERTIES }, ), ], }, { 'name': _('Relationships'), 'cells': [ ( EntityCellCustomFormSpecial, { 'name': EntityCellCustomFormSpecial.RELATIONS }, ), ], }, ], ) CustomFormConfigItem.objects.create_if_needed( descriptor=edition_descriptor, groups_desc=base_groups_desc, ) build_custom_form_items( creation_descriptor=custom_forms.ACT_CREATION_CFORM, edition_descriptor=custom_forms.ACT_EDITION_CFORM, field_names=[ 'user', 'name', 'expected_sales', 'cost', 'goal', 'start', 'due_date', 'act_type', 'segment', ], ) build_custom_form_items( creation_descriptor=custom_forms.PATTERN_CREATION_CFORM, edition_descriptor=custom_forms.PATTERN_EDITION_CFORM, field_names=[ 'user', 'name', 'average_sales', 'segment', ], ) build_custom_form_items( creation_descriptor=custom_forms.STRATEGY_CREATION_CFORM, edition_descriptor=custom_forms.STRATEGY_EDITION_CFORM, field_names=[ 'user', 'name', ], ) # --------------------------- create_searchconf = SearchConfigItem.objects.create_if_needed create_searchconf(Act, ['name', 'expected_sales', 'cost', 'goal']) create_searchconf(Strategy, ['name']) create_searchconf(ActObjectivePattern, [], disabled=True) # --------------------------- SettingValue.objects.get_or_create( key_id=setting_keys.orga_approaches_key.id, defaults={'value': True}, ) # --------------------------- Job.objects.get_or_create( type_id=creme_jobs.com_approaches_emails_send_type.id, defaults={ 'language': settings.LANGUAGE_CODE, 'periodicity': date_period_registry.get_period('days', 1), 'status': Job.STATUS_OK, # The CommercialApproach field for Activities' CustomForms is not # in the default configuration, so a enabled job would be annoying. 'enabled': False, }, ) # --------------------------- # TODO: move to "not already_populated" section in creme2.4 if not MenuConfigItem.objects.filter( entry_id__startswith='commercial-').exists(): container = MenuConfigItem.objects.get_or_create( entry_id=ContainerEntry.id, entry_data={'label': _('Commercial')}, defaults={'order': 30}, )[0] create_mitem = MenuConfigItem.objects.create create_mitem(entry_id=menu.ActsEntry.id, order=50, parent=container) create_mitem(entry_id=menu.StrategiesEntry.id, order=55, parent=container) create_mitem(entry_id=menu.SegmentsEntry.id, order=60, parent=container) create_mitem(entry_id=menu.PatternsEntry.id, order=70, parent=container) directory = MenuConfigItem.objects.filter( entry_id=ContainerEntry.id, entry_data={ 'label': _('Directory') }, ).first() if directory is not None: create_mitem(entry_id=menu.SalesmenEntry.id, order=100, parent=directory) creations = MenuConfigItem.objects.filter( entry_id=ContainerEntry.id, entry_data={ 'label': _('+ Creation') }, ).first() if creations is not None: create_mitem(entry_id=menu.ActCreationEntry.id, order=40, parent=creations) # --------------------------- if not already_populated: ButtonMenuItem.objects.create_if_needed( button=buttons.CompleteGoalButton, order=60, ) TOP = BrickDetailviewLocation.TOP RIGHT = BrickDetailviewLocation.RIGHT LEFT = BrickDetailviewLocation.LEFT # BrickDetailviewLocation.objects.multi_create( # defaults={'brick': bricks.ApproachesBrick, 'order': 10, 'zone': RIGHT}, # data=[ # {}, # default configuration # {'model': Contact}, # {'model': Organisation}, # ] # ) BrickDetailviewLocation.objects.multi_create( defaults={ 'model': Act, 'zone': LEFT }, data=[ { 'order': 5 }, # generic information brick { 'brick': bricks.ActObjectivesBrick, 'order': 10 }, { 'brick': bricks.RelatedOpportunitiesBrick, 'order': 20 }, { 'brick': core_bricks.CustomFieldsBrick, 'order': 40 }, { 'brick': core_bricks.PropertiesBrick, 'order': 450 }, { 'brick': core_bricks.RelationsBrick, 'order': 500 }, { 'brick': core_bricks.HistoryBrick, 'order': 20, 'zone': RIGHT }, ], ) BrickDetailviewLocation.objects.multi_create( defaults={ 'model': ActObjectivePattern, 'zone': LEFT }, data=[ { 'brick': bricks.PatternComponentsBrick, 'order': 10, 'zone': TOP }, { 'order': 5 }, { 'brick': core_bricks.CustomFieldsBrick, 'order': 40 }, { 'brick': core_bricks.PropertiesBrick, 'order': 450 }, { 'brick': core_bricks.RelationsBrick, 'order': 500 }, { 'brick': core_bricks.HistoryBrick, 'order': 20, 'zone': RIGHT }, ], ) BrickDetailviewLocation.objects.multi_create( defaults={ 'model': Strategy, 'zone': LEFT }, data=[ { 'brick': bricks.SegmentDescriptionsBrick, 'order': 10, 'zone': TOP }, { 'order': 5 }, { 'brick': core_bricks.CustomFieldsBrick, 'order': 40 }, { 'brick': bricks.EvaluatedOrgasBrick, 'order': 50 }, { 'brick': bricks.AssetsBrick, 'order': 60 }, { 'brick': bricks.CharmsBrick, 'order': 70 }, { 'brick': core_bricks.PropertiesBrick, 'order': 450 }, { 'brick': core_bricks.RelationsBrick, 'order': 500 }, { 'brick': core_bricks.HistoryBrick, 'order': 20, 'zone': RIGHT }, ], ) if apps.is_installed('creme.assistants'): logger.info('Assistants app is installed ' '=> we use the assistants blocks on detail views') from creme.assistants import bricks as a_bricks for model in (Act, ActObjectivePattern, Strategy): BrickDetailviewLocation.objects.multi_create( defaults={ 'model': model, 'zone': RIGHT }, data=[ { 'brick': a_bricks.TodosBrick, 'order': 100 }, { 'brick': a_bricks.MemosBrick, 'order': 200 }, { 'brick': a_bricks.AlertsBrick, 'order': 300 }, { 'brick': a_bricks.UserMessagesBrick, 'order': 400 }, ], ) if apps.is_installed('creme.documents'): # logger.info("Documents app is installed # => we use the documents blocks on Strategy's detail views") from creme.documents.bricks import LinkedDocsBrick BrickDetailviewLocation.objects.multi_create( defaults={ 'brick': LinkedDocsBrick, 'order': 600, 'zone': RIGHT }, data=[ { 'model': Act }, { 'model': ActObjectivePattern }, { 'model': Strategy }, ], )
def populate(self): already_populated = core_models.RelationType.objects.filter( pk=constants.REL_SUB_EMPLOYED_BY).exists() Contact = persons.get_contact_model() Organisation = persons.get_organisation_model() rt_map = {} for rt_info in [ ( (constants.REL_SUB_EMPLOYED_BY, _('is an employee of'), [Contact]), (constants.REL_OBJ_EMPLOYED_BY, _('employs'), [Organisation]), ), ( (constants.REL_SUB_CUSTOMER_SUPPLIER, _('is a customer of'), [Contact, Organisation]), (constants.REL_OBJ_CUSTOMER_SUPPLIER, _('is a supplier of'), [Contact, Organisation]), ), ( (constants.REL_SUB_MANAGES, _('manages'), [Contact]), (constants.REL_OBJ_MANAGES, _('managed by'), [Organisation]), ), ( (constants.REL_SUB_PROSPECT, _('is a prospect of'), [Contact, Organisation]), (constants.REL_OBJ_PROSPECT, _('has as prospect'), [Contact, Organisation]), ), ( (constants.REL_SUB_SUSPECT, _('is a suspect of'), [Contact, Organisation]), (constants.REL_OBJ_SUSPECT, _('has as suspect'), [Contact, Organisation]), ), ( (constants.REL_SUB_PARTNER, _('is a partner of'), [Contact, Organisation]), (constants.REL_OBJ_PARTNER, _('has as partner'), [Contact, Organisation]), ), ( (constants.REL_SUB_INACTIVE, _('is an inactive customer of'), [Contact, Organisation]), (constants.REL_OBJ_INACTIVE, _('has as inactive customer'), [Contact, Organisation]), ), ( (constants.REL_SUB_SUBSIDIARY, _('has as subsidiary'), [Organisation]), (constants.REL_OBJ_SUBSIDIARY, _('is a subsidiary of'), [Organisation]), ), ( (constants.REL_SUB_COMPETITOR, _('is a competitor of'), [Contact, Organisation]), (constants.REL_OBJ_COMPETITOR, _('has as competitor'), [Contact, Organisation]), ), ]: rt, sym_rt = core_models.RelationType.create(*rt_info) rt_map[rt.id] = rt rt_map[sym_rt.id] = sym_rt # --------------------------- EntityFilter.create( constants.FILTER_MANAGED_ORGA, name=_('Managed by creme'), model=Organisation, user='******', conditions=[ # EntityFilterCondition.build_4_field( # model=Organisation, # operator=EntityFilterCondition.EQUALS, # name='is_managed', # values=[True], # ), condition_handler.RegularFieldConditionHandler.build_condition( model=Organisation, operator=operators.EqualsOperator, field_name='is_managed', values=[True], ), ], ) EntityFilter.create( constants.FILTER_CONTACT_ME, name=_('Me'), model=Contact, user='******', conditions=[ # EntityFilterCondition.build_4_field( # model=Contact, # operator=EntityFilterCondition.EQUALS, # name='is_user', # values=[EntityFilterVariable.CURRENT_USER], # ), condition_handler.RegularFieldConditionHandler.build_condition( model=Contact, operator=operators.EqualsOperator, field_name='is_user', values=[operands.CurrentUserOperand.type_id], ), ], ) # --------------------------- create_hf = core_models.HeaderFilter.create create_hf( pk=constants.DEFAULT_HFILTER_CONTACT, model=Contact, name=_('Contact view'), cells_desc=[ (EntityCellRegularField, { 'name': 'last_name' }), (EntityCellRegularField, { 'name': 'first_name' }), (EntityCellRegularField, { 'name': 'phone' }), (EntityCellRegularField, { 'name': 'email' }), (EntityCellRegularField, { 'name': 'user' }), EntityCellRelation( model=Contact, rtype=rt_map[constants.REL_SUB_EMPLOYED_BY]), ], ) create_hf( pk=constants.DEFAULT_HFILTER_ORGA, model=Organisation, name=_('Organisation view'), cells_desc=[ (EntityCellRegularField, { 'name': 'name' }), (EntityCellRegularField, { 'name': 'phone' }), (EntityCellRegularField, { 'name': 'user' }), EntityCellRelation(model=Organisation, rtype=rt_map[constants.REL_OBJ_MANAGES]), ], ) create_hf( pk=constants.DEFAULT_HFILTER_ORGA_CUSTOMERS, model=Organisation, name=_('Prospect/Suspect view'), cells_desc=[ (EntityCellRegularField, { 'name': 'name' }), (EntityCellRegularField, { 'name': 'sector' }), (EntityCellRegularField, { 'name': 'phone' }), (EntityCellRegularField, { 'name': 'email' }), (EntityCellRegularField, { 'name': 'user' }), EntityCellRelation( model=Organisation, rtype=rt_map[constants.REL_SUB_CUSTOMER_SUPPLIER]), EntityCellRelation(model=Organisation, rtype=rt_map[constants.REL_SUB_PROSPECT]), EntityCellRelation(model=Organisation, rtype=rt_map[constants.REL_SUB_SUSPECT]), ], ) # --------------------------- create_sci = core_models.SearchConfigItem.create_if_needed create_sci(Contact, ['last_name', 'first_name', 'phone', 'mobile', 'email']) create_sci( Organisation, ['name', 'phone', 'email', 'sector__title', 'legal_form__title']) # --------------------------- if not already_populated: create_if_needed(Civility, {'pk': 1}, title=_('Madam'), shortcut=_('Mrs.')) create_if_needed(Civility, {'pk': 2}, title=_('Miss'), shortcut=_('Ms.')) create_if_needed(Civility, {'pk': 3}, title=_('Mister'), shortcut=_('Mr.')) create_if_needed(Civility, {'pk': 4}, title=_('N/A'), shortcut='') # --------------------------- # TODO: add relation to admin ???? if not Organisation.objects.exists(): Organisation.objects.create( user=get_user_model().objects.get_admin(), name=_('ReplaceByYourSociety'), is_managed=True, uuid=constants.UUID_FIRST_ORGA, ) # --------------------------- create_if_needed(Position, {'pk': 1}, title=_('CEO')) create_if_needed(Position, {'pk': 2}, title=_('Secretary')) create_if_needed(Position, {'pk': 3}, title=_('Technician')) # --------------------------- create_if_needed(Sector, {'pk': 1}, title=_('Food Industry')) create_if_needed(Sector, {'pk': 2}, title=_('Industry')) create_if_needed(Sector, {'pk': 3}, title=_('Software')) create_if_needed(Sector, {'pk': 4}, title=_('Telecom')) create_if_needed(Sector, {'pk': 5}, title=_('Restoration')) # --------------------------- # TODO: depend on the country no ?? create_if_needed(LegalForm, {'pk': 1}, title='SARL') create_if_needed(LegalForm, {'pk': 2}, title='Association loi 1901') create_if_needed(LegalForm, {'pk': 3}, title='SA') create_if_needed(LegalForm, {'pk': 4}, title='SAS') # --------------------------- create_if_needed(StaffSize, {'pk': 1}, size='1 - 5', order=1) create_if_needed(StaffSize, {'pk': 2}, size='6 - 10', order=2) create_if_needed(StaffSize, {'pk': 3}, size='11 - 50', order=3) create_if_needed(StaffSize, {'pk': 4}, size='51 - 100', order=4) create_if_needed(StaffSize, {'pk': 5}, size='100 - 500', order=5) create_if_needed(StaffSize, {'pk': 6}, size='> 500', order=6) # --------------------------- create_bmi = core_models.ButtonMenuItem.create_if_needed create_bmi(pk='persons-customer_contact_button', model=Contact, button=buttons.BecomeCustomerButton, order=20) create_bmi(pk='persons-prospect_contact_button', model=Contact, button=buttons.BecomeProspectButton, order=21) create_bmi(pk='persons-suspect_contact_button', model=Contact, button=buttons.BecomeSuspectButton, order=22) create_bmi(pk='persons-inactive_contact_button', model=Contact, button=buttons.BecomeInactiveButton, order=24) create_bmi(pk='persons-customer_orga_button', model=Organisation, button=buttons.BecomeCustomerButton, order=20) create_bmi(pk='persons-prospect_orga_button', model=Organisation, button=buttons.BecomeProspectButton, order=21) create_bmi(pk='persons-suspect_orga_button', model=Organisation, button=buttons.BecomeSuspectButton, order=22) create_bmi(pk='persons-inactive_orga_button', model=Organisation, button=buttons.BecomeInactiveButton, order=23) create_bmi(pk='persons-supplier_button', model=Organisation, button=buttons.BecomeSupplierButton, order=24) create_bmi(pk='persons-linked_contact_button', model=Organisation, button=buttons.AddLinkedContactButton, order=25) # Populate bricks ------------------ create_rbi = core_models.RelationBrickItem.objects.create_if_needed rbi_1 = create_rbi(constants.REL_SUB_CUSTOMER_SUPPLIER) rbi_2 = create_rbi(constants.REL_OBJ_CUSTOMER_SUPPLIER) create_cbci = core_models.CustomBrickConfigItem.objects.create build_cell = EntityCellRegularField.build # cbci_orga_1 = create_cbci( id='persons-organisation_main_info', name=_('Organisation information'), content_type=Organisation, cells=[ build_cell(Organisation, 'name'), build_cell(Organisation, 'is_managed'), build_cell(Organisation, 'staff_size'), build_cell(Organisation, 'legal_form'), build_cell(Organisation, 'sector'), build_cell(Organisation, 'capital'), build_cell(Organisation, 'siren'), build_cell(Organisation, 'naf'), build_cell(Organisation, 'siret'), build_cell(Organisation, 'rcs'), build_cell(Organisation, 'tvaintra'), build_cell(Organisation, 'subject_to_vat'), build_cell(Organisation, 'annual_revenue'), build_cell(Organisation, 'creation_date'), build_cell(Organisation, 'image'), # -- build_cell(Organisation, 'description'), # -- build_cell(Organisation, 'created'), build_cell(Organisation, 'modified'), build_cell(Organisation, 'user'), ], ) # cbci_orga_2 = create_cbci( id='persons-organisation_details', name=_('Organisation details'), content_type=Organisation, cells=[ build_cell(Organisation, 'phone'), build_cell(Organisation, 'fax'), build_cell(Organisation, 'email'), build_cell(Organisation, 'url_site'), ], ) cbci_orga_extra = create_cbci( id='persons-organisation_complementary', name=_('Organisation complementary information'), content_type=Organisation, cells=[ build_cell(Organisation, 'staff_size'), build_cell(Organisation, 'sector'), build_cell(Organisation, 'capital'), build_cell(Organisation, 'siren'), build_cell(Organisation, 'naf'), build_cell(Organisation, 'siret'), build_cell(Organisation, 'rcs'), build_cell(Organisation, 'tvaintra'), build_cell(Organisation, 'subject_to_vat'), build_cell(Organisation, 'annual_revenue'), build_cell(Organisation, 'creation_date'), build_cell(Organisation, 'image'), # -- build_cell(Organisation, 'description'), # -- build_cell(Organisation, 'fax'), build_cell(Organisation, 'email'), build_cell(Organisation, 'url_site'), ], ) HAT = core_models.BrickDetailviewLocation.HAT LEFT = core_models.BrickDetailviewLocation.LEFT RIGHT = core_models.BrickDetailviewLocation.RIGHT create_bdl = core_models.BrickDetailviewLocation.objects.create_if_needed create_bdl(brick=bricks.OrganisationCardHatBrick, order=1, zone=HAT, model=Organisation) create_bdl(brick=cbci_orga_extra.generate_id(), order=5, zone=LEFT, model=Organisation) create_bdl(brick=core_bricks.CustomFieldsBrick, order=40, zone=LEFT, model=Organisation) create_bdl(brick=bricks.PrettyAddressesBrick, order=50, zone=LEFT, model=Organisation) create_bdl(brick=bricks.PrettyOtherAddressesBrick, order=60, zone=LEFT, model=Organisation) create_bdl(brick=bricks.ManagersBrick, order=100, zone=LEFT, model=Organisation) create_bdl(brick=bricks.EmployeesBrick, order=120, zone=LEFT, model=Organisation) create_bdl(brick=core_bricks.PropertiesBrick, order=450, zone=LEFT, model=Organisation) create_bdl(brick=core_bricks.RelationsBrick, order=500, zone=LEFT, model=Organisation) create_bdl(brick=rbi_1.brick_id, order=5, zone=RIGHT, model=Organisation) create_bdl(brick=rbi_2.brick_id, order=10, zone=RIGHT, model=Organisation) create_bdl(brick=core_bricks.HistoryBrick, order=30, zone=RIGHT, model=Organisation) create_cbci( id='persons-contact_main_info', name=_('Contact information'), content_type=Contact, cells=[ build_cell(Contact, 'civility'), build_cell(Contact, 'first_name'), build_cell(Contact, 'last_name'), build_cell(Contact, 'sector'), build_cell(Contact, 'position'), build_cell(Contact, 'full_position'), build_cell(Contact, 'is_user'), build_cell(Contact, 'birthday'), build_cell(Contact, 'image'), # -- build_cell(Contact, 'description'), # -- build_cell(Contact, 'created'), build_cell(Contact, 'modified'), build_cell(Contact, 'user'), ], ) create_cbci( id='persons-contact_details', name=_('Contact details'), content_type=Contact, cells=[ build_cell(Contact, 'phone'), build_cell(Contact, 'mobile'), build_cell(Contact, 'fax'), build_cell(Contact, 'email'), build_cell(Contact, 'url_site'), build_cell(Contact, 'skype'), ], ) cbci_contact_extra = create_cbci( id='persons-contact_complementary', name=_('Contact complementary information'), content_type=Contact, cells=[ build_cell(Contact, 'sector'), build_cell(Contact, 'full_position'), build_cell(Contact, 'birthday'), build_cell(Contact, 'image'), # -- build_cell(Contact, 'description'), # -- build_cell(Contact, 'fax'), build_cell(Contact, 'url_site'), build_cell(Contact, 'skype'), ], ) create_bdl(brick=bricks.ContactCardHatBrick, order=1, zone=HAT, model=Contact) create_bdl(brick=cbci_contact_extra.generate_id(), order=30, zone=LEFT, model=Contact) create_bdl(brick=core_bricks.CustomFieldsBrick, order=40, zone=LEFT, model=Contact) create_bdl(brick=bricks.PrettyAddressesBrick, order=50, zone=LEFT, model=Contact) create_bdl(brick=bricks.PrettyOtherAddressesBrick, order=60, zone=LEFT, model=Contact) create_bdl(brick=core_bricks.PropertiesBrick, order=450, zone=LEFT, model=Contact) create_bdl(brick=core_bricks.RelationsBrick, order=500, zone=LEFT, model=Contact) create_bdl(brick=core_bricks.HistoryBrick, order=20, zone=RIGHT, model=Contact) if apps.is_installed('creme.assistants'): logger.info( 'Assistants app is installed => we use the assistants blocks on detail views and portal' ) from creme.assistants import bricks as a_bricks create_bdl(brick=a_bricks.TodosBrick, order=100, zone=RIGHT, model=Contact) create_bdl(brick=a_bricks.MemosBrick, order=200, zone=RIGHT, model=Contact) create_bdl(brick=a_bricks.AlertsBrick, order=300, zone=RIGHT, model=Contact) create_bdl(brick=a_bricks.UserMessagesBrick, order=500, zone=RIGHT, model=Contact) create_bdl(brick=a_bricks.TodosBrick, order=100, zone=RIGHT, model=Organisation) create_bdl(brick=a_bricks.MemosBrick, order=200, zone=RIGHT, model=Organisation) create_bdl(brick=a_bricks.AlertsBrick, order=300, zone=RIGHT, model=Organisation) create_bdl(brick=a_bricks.UserMessagesBrick, order=500, zone=RIGHT, model=Organisation) if apps.is_installed('creme.documents'): # logger.info('Documents app is installed => we use the documents block on detail views') from creme.documents.bricks import LinkedDocsBrick create_bdl(brick=LinkedDocsBrick, order=600, zone=RIGHT, model=Contact) create_bdl(brick=LinkedDocsBrick, order=600, zone=RIGHT, model=Organisation) if apps.is_installed('creme.activities'): core_models.BrickHomeLocation.objects.create( brick_id=bricks.NeglectedOrganisationsBrick.id_, order=15)
def populate(self): already_populated = RelationType.objects.filter(pk=constants.REL_SUB_SOLD_BY).exists() Act = commercial.get_act_model() ActObjectivePattern = commercial.get_pattern_model() Strategy = commercial.get_strategy_model() Contact = persons.get_contact_model() Organisation = persons.get_organisation_model() RelationType.create((constants.REL_SUB_SOLD_BY, _(u'has sold')), (constants.REL_OBJ_SOLD_BY, _(u'has been sold by'))) RelationType.create((constants.REL_SUB_COMPLETE_GOAL, _(u'completes a goal of the commercial action')), (constants.REL_OBJ_COMPLETE_GOAL, _(u'is completed thanks to'), [Act])) # --------------------------- CremePropertyType.create(constants.PROP_IS_A_SALESMAN, _(u'is a salesman'), [Contact]) # --------------------------- MarketSegment.objects.get_or_create(property_type=None, defaults={'name': _(u'All the organisations')}, ) # --------------------------- for i, title in enumerate([_(u'Phone calls'), _(u'Show'), _(u'Demo')], start=1): create_if_needed(ActType, {'pk': i}, title=title, is_custom=False) # --------------------------- create_hf = HeaderFilter.create create_hf(pk=constants.DEFAULT_HFILTER_ACT, model=Act, name=_(u'Com Action view'), cells_desc=[(EntityCellRegularField, {'name': 'name'}), (EntityCellRegularField, {'name': 'expected_sales'}), (EntityCellRegularField, {'name': 'due_date'}), ], ) create_hf(pk=constants.DEFAULT_HFILTER_STRATEGY, model=Strategy, name=_(u"Strategy view"), cells_desc=[(EntityCellRegularField, {'name': 'name'})], ) create_hf(pk=constants.DEFAULT_HFILTER_PATTERN, model=ActObjectivePattern, name=_(u"Objective pattern view"), cells_desc=[(EntityCellRegularField, {'name': 'name'}), (EntityCellRegularField, {'name': 'segment'}), ] ) # --------------------------- create_searchconf = SearchConfigItem.create_if_needed create_searchconf(Act, ['name', 'expected_sales', 'cost', 'goal']) create_searchconf(Strategy, ['name']) create_searchconf(ActObjectivePattern, [], disabled=True) # --------------------------- SettingValue.objects.get_or_create(key_id=setting_keys.orga_approaches_key.id, defaults={'value': True}) # --------------------------- Job.objects.get_or_create(type_id=creme_jobs.com_approaches_emails_send_type.id, defaults={'language': settings.LANGUAGE_CODE, 'periodicity': date_period_registry.get_period('days', 1), 'status': Job.STATUS_OK, } ) # --------------------------- if not already_populated: ButtonMenuItem.create_if_needed(pk='commercial-complete_goal_button', model=None, button=buttons.CompleteGoalButton, order=60, ) create_bdl = BrickDetailviewLocation.create_if_needed TOP = BrickDetailviewLocation.TOP RIGHT = BrickDetailviewLocation.RIGHT LEFT = BrickDetailviewLocation.LEFT create_bdl(brick_id=bricks.ApproachesBrick.id_, order=10, zone=RIGHT) create_bdl(brick_id=bricks.ApproachesBrick.id_, order=10, zone=RIGHT, model=Contact) create_bdl(brick_id=bricks.ApproachesBrick.id_, order=10, zone=RIGHT, model=Organisation) BrickDetailviewLocation.create_4_model_brick( order=5, zone=LEFT, model=Act) create_bdl(brick_id=bricks.ActObjectivesBrick.id_, order=10, zone=LEFT, model=Act) create_bdl(brick_id=bricks.RelatedOpportunitiesBrick.id_, order=20, zone=LEFT, model=Act) create_bdl(brick_id=core_bricks.CustomFieldsBrick.id_, order=40, zone=LEFT, model=Act) create_bdl(brick_id=core_bricks.PropertiesBrick.id_, order=450, zone=LEFT, model=Act) create_bdl(brick_id=core_bricks.RelationsBrick.id_, order=500, zone=LEFT, model=Act) create_bdl(brick_id=core_bricks.HistoryBrick.id_, order=20, zone=RIGHT, model=Act) create_bdl(brick_id=bricks.PatternComponentsBrick.id_, order=10, zone=TOP, model=ActObjectivePattern) BrickDetailviewLocation.create_4_model_brick( order=5, zone=LEFT, model=ActObjectivePattern) create_bdl(brick_id=core_bricks.CustomFieldsBrick.id_, order=40, zone=LEFT, model=ActObjectivePattern) create_bdl(brick_id=core_bricks.PropertiesBrick.id_, order=450, zone=LEFT, model=ActObjectivePattern) create_bdl(brick_id=core_bricks.RelationsBrick.id_, order=500, zone=LEFT, model=ActObjectivePattern) create_bdl(brick_id=core_bricks.HistoryBrick.id_, order=20, zone=RIGHT, model=ActObjectivePattern) create_bdl(brick_id=bricks.SegmentDescriptionsBrick.id_, order=10, zone=TOP, model=Strategy) BrickDetailviewLocation.create_4_model_brick( order=5, zone=LEFT, model=Strategy) create_bdl(brick_id=core_bricks.CustomFieldsBrick.id_, order=40, zone=LEFT, model=Strategy) create_bdl(brick_id=bricks.EvaluatedOrgasBrick.id_, order=50, zone=LEFT, model=Strategy) create_bdl(brick_id=bricks.AssetsBrick.id_, order=60, zone=LEFT, model=Strategy) create_bdl(brick_id=bricks.CharmsBrick.id_, order=70, zone=LEFT, model=Strategy) create_bdl(brick_id=core_bricks.PropertiesBrick.id_, order=450, zone=LEFT, model=Strategy) create_bdl(brick_id=core_bricks.RelationsBrick.id_, order=500, zone=LEFT, model=Strategy) create_bdl(brick_id=core_bricks.HistoryBrick.id_, order=20, zone=RIGHT, model=Strategy) if apps.is_installed('creme.assistants'): logger.info('Assistants app is installed => we use the assistants blocks on detail views') from creme.assistants import bricks as assistants_bricks for model in (Act, ActObjectivePattern, Strategy): create_bdl(brick_id=assistants_bricks.TodosBrick.id_, order=100, zone=RIGHT, model=model) create_bdl(brick_id=assistants_bricks.MemosBrick.id_, order=200, zone=RIGHT, model=model) create_bdl(brick_id=assistants_bricks.AlertsBrick.id_, order=300, zone=RIGHT, model=model) create_bdl(brick_id=assistants_bricks.UserMessagesBrick.id_, order=400, zone=RIGHT, model=model) if apps.is_installed('creme.documents'): # logger.info("Documents app is installed => we use the documents blocks on Strategy's detail views") from creme.documents.bricks import LinkedDocsBrick for model in (Act, ActObjectivePattern, Strategy): create_bdl(brick_id=LinkedDocsBrick.id_, order=600, zone=RIGHT, model=model)
def populate(self): already_populated = RelationType.objects.filter( pk=constants.REL_SUB_LINKED_2_ACTIVITY).exists() Contact = persons.get_contact_model() Organisation = persons.get_organisation_model() Activity = get_activity_model() # --------------------------- create_rtype = RelationType.create create_rtype( (constants.REL_SUB_LINKED_2_ACTIVITY, _('related to the activity')), (constants.REL_OBJ_LINKED_2_ACTIVITY, _('(activity) related to'), [Activity]), minimal_display=(True, False), ) rt_obj_activity_subject = create_rtype( (constants.REL_SUB_ACTIVITY_SUBJECT, _('is subject of the activity'), [Contact, Organisation]), (constants.REL_OBJ_ACTIVITY_SUBJECT, _('(activity) has for subject'), [Activity]), minimal_display=(True, False), )[1] rt_obj_part_2_activity = create_rtype( (constants.REL_SUB_PART_2_ACTIVITY, _('participates to the activity'), [Contact]), (constants.REL_OBJ_PART_2_ACTIVITY, _('(activity) has as participant'), [Activity]), is_internal=True, minimal_display=(True, False), )[1] # --------------------------- create_if_needed(Status, {'pk': constants.STATUS_PLANNED}, name=pgettext('activities-status', 'Planned'), description=pgettext('activities-status', 'Planned'), is_custom=False) create_if_needed(Status, {'pk': constants.STATUS_IN_PROGRESS}, name=pgettext('activities-status', 'In progress'), description=pgettext('activities-status', 'In progress'), is_custom=False) create_if_needed(Status, {'pk': constants.STATUS_DONE}, name=pgettext('activities-status', 'Done'), description=pgettext('activities-status', 'Done'), is_custom=False) create_if_needed(Status, {'pk': constants.STATUS_DELAYED}, name=pgettext('activities-status', 'Delayed'), description=pgettext('activities-status', 'Delayed'), is_custom=False) create_if_needed(Status, {'pk': constants.STATUS_CANCELLED}, name=pgettext('activities-status', 'Cancelled'), description=pgettext('activities-status', 'Cancelled'), is_custom=False) # --------------------------- create_if_needed(ActivityType, {'pk': constants.ACTIVITYTYPE_TASK}, name=_('Task'), default_day_duration=0, default_hour_duration="00:15:00", is_custom=False) meeting_type = \ create_if_needed(ActivityType, {'pk': constants.ACTIVITYTYPE_MEETING}, name=_('Meeting'), default_day_duration=0, default_hour_duration="00:15:00", is_custom=False) phone_call_type = \ create_if_needed(ActivityType, {'pk': constants.ACTIVITYTYPE_PHONECALL}, name=_('Phone call'), default_day_duration=0, default_hour_duration="00:15:00", is_custom=False) create_if_needed(ActivityType, {'pk': constants.ACTIVITYTYPE_GATHERING}, name=_('Gathering'), default_day_duration=0, default_hour_duration="00:15:00", is_custom=False) create_if_needed(ActivityType, {'pk': constants.ACTIVITYTYPE_SHOW}, name=_('Show'), default_day_duration=1, default_hour_duration="00:00:00", is_custom=False) create_if_needed(ActivityType, {'pk': constants.ACTIVITYTYPE_DEMO}, name=_('Demonstration'), default_day_duration=0, default_hour_duration="01:00:00", is_custom=False) create_if_needed(ActivityType, {'pk': constants.ACTIVITYTYPE_INDISPO}, name=_('Unavailability'), default_day_duration=1, default_hour_duration="00:00:00", is_custom=False) create_if_needed(ActivitySubType, {'pk': constants.ACTIVITYSUBTYPE_MEETING_MEETING}, name=_('Meeting'), type=meeting_type, is_custom=False) create_if_needed( ActivitySubType, {'pk': constants.ACTIVITYSUBTYPE_MEETING_QUALIFICATION}, name=_('Qualification'), type=meeting_type, is_custom=False) create_if_needed(ActivitySubType, {'pk': constants.ACTIVITYSUBTYPE_MEETING_REVIVAL}, name=_('Revival'), type=meeting_type, is_custom=False) create_if_needed(ActivitySubType, {'pk': constants.ACTIVITYSUBTYPE_MEETING_NETWORK}, name=_('Network'), type=meeting_type, is_custom=False) create_if_needed(ActivitySubType, {'pk': constants.ACTIVITYSUBTYPE_MEETING_OTHER}, name=pgettext('activities-meeting', 'Other'), type=meeting_type, is_custom=False) create_if_needed(ActivitySubType, {'pk': constants.ACTIVITYSUBTYPE_PHONECALL_INCOMING}, name=_('Incoming'), type=phone_call_type, is_custom=False) create_if_needed(ActivitySubType, {'pk': constants.ACTIVITYSUBTYPE_PHONECALL_OUTGOING}, name=_('Outgoing'), type=phone_call_type, is_custom=False) create_if_needed( ActivitySubType, {'pk': constants.ACTIVITYSUBTYPE_PHONECALL_CONFERENCE}, name=_('Conference'), type=phone_call_type, is_custom=False) create_if_needed(ActivitySubType, {'pk': constants.ACTIVITYSUBTYPE_PHONECALL_FAILED}, name=_('Outgoing - Failed'), type=phone_call_type, is_custom=False) # --------------------------- HeaderFilter.create( pk=constants.DEFAULT_HFILTER_ACTIVITY, name=_('Activity view'), model=Activity, cells_desc=[ (EntityCellRegularField, { 'name': 'start' }), (EntityCellRegularField, { 'name': 'title' }), (EntityCellRegularField, { 'name': 'type' }), EntityCellRelation(model=Activity, rtype=rt_obj_part_2_activity), EntityCellRelation(model=Activity, rtype=rt_obj_activity_subject), (EntityCellRegularField, { 'name': 'user' }), (EntityCellRegularField, { 'name': 'end' }), ], ) # --------------------------- create_efilter = EntityFilter.create for pk, name, atype_id in ( (constants.EFILTER_MEETINGS, _('Meetings'), constants.ACTIVITYTYPE_MEETING), (constants.EFILTER_PHONECALLS, _('Phone calls'), constants.ACTIVITYTYPE_PHONECALL), (constants.EFILTER_TASKS, _('Tasks'), constants.ACTIVITYTYPE_TASK), ): create_efilter( pk, name=name, model=Activity, is_custom=False, user='******', conditions=[ # EntityFilterCondition.build_4_field( # model=Activity, # operator=EntityFilterCondition.EQUALS, # name='type', # values=[atype_id], # ), condition_handler.RegularFieldConditionHandler. build_condition( model=Activity, operator=operators.EqualsOperator, field_name='type', values=[atype_id], ), ], ) create_efilter( constants.EFILTER_PARTICIPATE, name=_('In which I participate'), model=Activity, is_custom=False, user='******', conditions=[ # EntityFilterCondition.build_4_relation_subfilter( # rtype=rt_obj_part_2_activity, # subfilter=EntityFilter.get_latest_version(FILTER_CONTACT_ME) # ), condition_handler.RelationSubFilterConditionHandler. build_condition( model=Activity, rtype=rt_obj_part_2_activity, subfilter=EntityFilter.get_latest_version( FILTER_CONTACT_ME), ), ], ) # --------------------------- SearchConfigItem.create_if_needed( Activity, ['title', 'description', 'type__name']) # --------------------------- # for user in get_user_model().objects.all(): # Calendar.objects.get_default_calendar(user) # TODO: remove this code in Creme 2.2 (it avoids install of creme which # are upgraded to 2.1 to force using the command "activities_create_default_calendars") cal_is_public = settings.ACTIVITIES_DEFAULT_CALENDAR_IS_PUBLIC if cal_is_public is not None: if isinstance(cal_is_public, bool): users = get_user_model().objects.filter( is_staff=False, is_active=True, calendar__is_default__isnull=True, ) for user in users: Calendar.objects.create_default_calendar( user=user, is_public=cal_is_public) else: logger.error( 'ACTIVITIES_DEFAULT_CALENDAR_IS_PUBLIC is invalid ' '(not in {None, True, False}) ') # --------------------------- create_svalue = SettingValue.objects.get_or_create create_svalue(key_id=setting_keys.review_key.id, defaults={'value': True}) create_svalue(key_id=setting_keys.auto_subjects_key.id, defaults={'value': True}) create_svalue(key_id=setting_keys.form_user_messages_key.id, defaults={'value': False}) # --------------------------- if not already_populated: LEFT = BrickDetailviewLocation.LEFT RIGHT = BrickDetailviewLocation.RIGHT BrickDetailviewLocation.objects.create_for_model_brick( order=5, zone=LEFT, model=Activity) create_bdl = BrickDetailviewLocation.objects.create_if_needed create_bdl(brick=core_bricks.CustomFieldsBrick, order=40, zone=LEFT, model=Activity) create_bdl(brick=bricks.RelatedCalendarBrick, order=90, zone=LEFT, model=Activity) create_bdl(brick=bricks.ParticipantsBrick, order=100, zone=LEFT, model=Activity) create_bdl(brick=bricks.SubjectsBrick, order=120, zone=LEFT, model=Activity) create_bdl(brick=core_bricks.PropertiesBrick, order=450, zone=LEFT, model=Activity) create_bdl(brick=core_bricks.RelationsBrick, order=500, zone=LEFT, model=Activity) create_bdl(brick=core_bricks.HistoryBrick, order=20, zone=RIGHT, model=Activity) if apps.is_installed('creme.assistants'): logger.info( 'Assistants app is installed => we use the assistants blocks on detail views' ) from creme.assistants import bricks as a_bricks create_bdl(brick=a_bricks.TodosBrick, order=100, zone=RIGHT, model=Activity) create_bdl(brick=a_bricks.MemosBrick, order=200, zone=RIGHT, model=Activity) create_bdl(brick=a_bricks.AlertsBrick, order=300, zone=RIGHT, model=Activity) create_bdl(brick=a_bricks.UserMessagesBrick, order=400, zone=RIGHT, model=Activity) if apps.is_installed('creme.documents'): # logger.info('Documents app is installed => we use the documents block on detail views') from creme.documents.bricks import LinkedDocsBrick create_bdl(brick=LinkedDocsBrick, order=600, zone=RIGHT, model=Activity) future_id = bricks.FutureActivitiesBrick.id_ past_id = bricks.PastActivitiesBrick.id_ create_bdl(brick=future_id, order=20, zone=RIGHT, model=Contact) create_bdl(brick=past_id, order=21, zone=RIGHT, model=Contact) create_bdl(brick=future_id, order=20, zone=RIGHT, model=Organisation) create_bdl(brick=past_id, order=21, zone=RIGHT, model=Organisation) BrickHomeLocation.objects.create(brick_id=future_id, order=20) BrickHomeLocation.objects.create(brick_id=past_id, order=21) # --------------------------- create_button = ButtonMenuItem.create_if_needed create_button('activities-add_activity_button', model=None, button=buttons.AddRelatedActivityButton, order=10) create_button('activities-add_meeting_button', model=None, button=buttons.AddMeetingButton, order=11) create_button('activities-add_phonecall_button', model=None, button=buttons.AddPhoneCallButton, order=12)
def populate(self): already_populated = RelationType.objects.filter( pk=constants.REL_SUB_LINKED_2_TICKET, ).exists() Ticket = get_ticket_model() TicketTemplate = get_tickettemplate_model() RelationType.create( (constants.REL_SUB_LINKED_2_TICKET, _('is linked to the ticket')), (constants.REL_OBJ_LINKED_2_TICKET, _('(ticket) linked to the entity'), [Ticket]), ) if apps.is_installed('creme.activities'): logger.info( 'Activities app is installed => a Ticket can be the subject of an Activity' ) from creme.activities.constants import REL_SUB_ACTIVITY_SUBJECT RelationType.objects.get( pk=REL_SUB_ACTIVITY_SUBJECT).add_subject_ctypes(Ticket) # --------------------------- for pk, name, is_closed in BASE_STATUS: create_if_needed( Status, {'pk': pk}, name=str(name), is_closed=is_closed, is_custom=False, order=pk, ) # --------------------------- create_hf = HeaderFilter.objects.create_if_needed create_hf( pk=constants.DEFAULT_HFILTER_TICKET, model=Ticket, name=_('Ticket view'), cells_desc=[ (EntityCellRegularField, { 'name': 'number' }), (EntityCellRegularField, { 'name': 'title' }), (EntityCellRegularField, { 'name': 'status' }), (EntityCellRegularField, { 'name': 'priority' }), (EntityCellRegularField, { 'name': 'criticity' }), (EntityCellRegularField, { 'name': 'closing_date' }), ], ) create_hf( pk=constants.DEFAULT_HFILTER_TTEMPLATE, model=TicketTemplate, name=_('Ticket template view'), cells_desc=[ (EntityCellRegularField, { 'name': 'title' }), (EntityCellRegularField, { 'name': 'status' }), (EntityCellRegularField, { 'name': 'priority' }), (EntityCellRegularField, { 'name': 'criticity' }), ], ) # --------------------------- common_groups_desc = [ { 'name': _('Description'), 'layout': LAYOUT_DUAL_SECOND, 'cells': [ (EntityCellRegularField, { 'name': 'description' }), ], }, { 'name': _('Custom fields'), 'layout': LAYOUT_DUAL_SECOND, 'cells': [ ( EntityCellCustomFormSpecial, { 'name': EntityCellCustomFormSpecial.REMAINING_CUSTOMFIELDS }, ), ], }, ] creation_only_groups_desc = [ { 'name': _('Properties'), 'cells': [ ( EntityCellCustomFormSpecial, { 'name': EntityCellCustomFormSpecial.CREME_PROPERTIES }, ), ], }, { 'name': _('Relationships'), 'cells': [ ( EntityCellCustomFormSpecial, { 'name': EntityCellCustomFormSpecial.RELATIONS }, ), ], }, ] CustomFormConfigItem.objects.create_if_needed( descriptor=custom_forms.TICKET_CREATION_CFORM, groups_desc=[ { 'name': _('General information'), 'layout': LAYOUT_DUAL_FIRST, 'cells': [ (EntityCellRegularField, { 'name': 'user' }), (EntityCellRegularField, { 'name': 'title' }), (EntityCellRegularField, { 'name': 'priority' }), (EntityCellRegularField, { 'name': 'criticity' }), (EntityCellRegularField, { 'name': 'solution' }), ( EntityCellCustomFormSpecial, { 'name': EntityCellCustomFormSpecial. REMAINING_REGULARFIELDS }, ), ], }, *common_groups_desc, *creation_only_groups_desc, ], ) CustomFormConfigItem.objects.create_if_needed( descriptor=custom_forms.TICKET_EDITION_CFORM, groups_desc=[ { 'name': _('General information'), 'cells': [ (EntityCellRegularField, { 'name': 'user' }), (EntityCellRegularField, { 'name': 'title' }), (EntityCellRegularField, { 'name': 'status' }), (EntityCellRegularField, { 'name': 'priority' }), (EntityCellRegularField, { 'name': 'criticity' }), (EntityCellRegularField, { 'name': 'solution' }), ( EntityCellCustomFormSpecial, { 'name': EntityCellCustomFormSpecial. REMAINING_REGULARFIELDS }, ), ], }, *common_groups_desc, ], ) template_rfields_group_desc = { 'name': _('General information'), 'cells': [ (EntityCellRegularField, { 'name': 'user' }), (EntityCellRegularField, { 'name': 'title' }), (EntityCellRegularField, { 'name': 'status' }), (EntityCellRegularField, { 'name': 'priority' }), (EntityCellRegularField, { 'name': 'criticity' }), (EntityCellRegularField, { 'name': 'solution' }), ( EntityCellCustomFormSpecial, { 'name': EntityCellCustomFormSpecial.REMAINING_REGULARFIELDS }, ), ], } CustomFormConfigItem.objects.create_if_needed( descriptor=custom_forms.TTEMPLATE_CREATION_CFORM, groups_desc=[ template_rfields_group_desc, *common_groups_desc, *creation_only_groups_desc, ], ) CustomFormConfigItem.objects.create_if_needed( descriptor=custom_forms.TTEMPLATE_EDITION_CFORM, groups_desc=[ template_rfields_group_desc, *common_groups_desc, ], ) # --------------------------- SearchConfigItem.objects.create_if_needed( Ticket, [ 'title', 'number', 'description', 'status__name', 'priority__name', 'criticity__name', ], ) # --------------------------- # TODO: move to "not already_populated" section in creme2.4 if not MenuConfigItem.objects.filter( entry_id__startswith='tickets-').exists(): container = MenuConfigItem.objects.get_or_create( entry_id=ContainerEntry.id, entry_data={'label': _('Tools')}, defaults={'order': 100}, )[0] MenuConfigItem.objects.create( entry_id=TicketsEntry.id, parent=container, order=100, ) # --------------------------- if not already_populated: for i, name in enumerate( [_('Low'), _('Normal'), _('High'), _('Urgent'), _('Blocking')], start=1, ): create_if_needed(Priority, {'pk': i}, name=name, order=i) for i, name in enumerate( [ _('Minor'), _('Major'), _('Feature'), _('Critical'), _('Enhancement'), _('Error') ], start=1, ): create_if_needed(Criticity, {'pk': i}, name=name, order=i) # --------------------------- rbi = RelationBrickItem.objects.create_if_needed( constants.REL_OBJ_LINKED_2_TICKET) RIGHT = BrickDetailviewLocation.RIGHT BrickDetailviewLocation.objects.multi_create( defaults={ 'model': Ticket, 'zone': BrickDetailviewLocation.LEFT }, data=[ { 'order': 5 }, { 'brick': core_bricks.CustomFieldsBrick, 'order': 40 }, { 'brick': core_bricks.PropertiesBrick, 'order': 450 }, { 'brick': core_bricks.RelationsBrick, 'order': 500 }, { 'brick': rbi.brick_id, 'order': 1, 'zone': RIGHT }, { 'brick': core_bricks.HistoryBrick, 'order': 20, 'zone': RIGHT }, ]) if apps.is_installed('creme.assistants'): logger.info( 'Assistants app is installed => we use the assistants blocks on detail view' ) from creme.assistants import bricks as a_bricks BrickDetailviewLocation.objects.multi_create( defaults={ 'model': Ticket, 'zone': RIGHT }, data=[ { 'brick': a_bricks.TodosBrick, 'order': 100 }, { 'brick': a_bricks.MemosBrick, 'order': 200 }, { 'brick': a_bricks.AlertsBrick, 'order': 300 }, { 'brick': a_bricks.UserMessagesBrick, 'order': 400 }, ], ) if apps.is_installed('creme.documents'): # logger.info("Documents app is installed # => we use the documents block on Ticket's detail views") from creme.documents.bricks import LinkedDocsBrick BrickDetailviewLocation.objects.create_if_needed( brick=LinkedDocsBrick, order=600, zone=RIGHT, model=Ticket, ) # --------------------------- if apps.is_installed('creme.persons'): try: from creme.persons import ( get_contact_model, get_organisation_model, ) except ImportError as e: logger.info(str(e)) else: from creme.tickets.buttons import Linked2TicketButton logger.info( "'Persons' app is installed " "=> add button 'Linked to a ticket' to Contact & Organisation" ) create_bmi = ButtonMenuItem.objects.create_if_needed for model in (get_contact_model(), get_organisation_model()): create_bmi(model=model, button=Linked2TicketButton, order=50)
def create_invoice_status(pk, name, **kwargs): create_if_needed(InvoiceStatus, {'pk': pk}, name=name, **kwargs)
def populate(self): already_populated = RelationType.objects.filter( pk=constants.REL_SUB_LINKED_2_ACTIVITY, ).exists() Contact = persons.get_contact_model() Organisation = persons.get_organisation_model() Activity = get_activity_model() # --------------------------- create_rtype = RelationType.create create_rtype( (constants.REL_SUB_LINKED_2_ACTIVITY, _('related to the activity')), (constants.REL_OBJ_LINKED_2_ACTIVITY, _('(activity) related to'), [Activity]), minimal_display=(True, False), ) rt_obj_activity_subject = create_rtype( ( constants.REL_SUB_ACTIVITY_SUBJECT, _('is subject of the activity'), [Contact, Organisation], ), ( constants.REL_OBJ_ACTIVITY_SUBJECT, _('(activity) has for subject'), [Activity], ), minimal_display=(True, False), )[1] rt_obj_part_2_activity = create_rtype( (constants.REL_SUB_PART_2_ACTIVITY, _('participates to the activity'), [Contact]), (constants.REL_OBJ_PART_2_ACTIVITY, _('(activity) has as participant'), [Activity]), is_internal=True, minimal_display=(True, False), )[1] # --------------------------- def create_status(pk, name): create_if_needed( Status, {'pk': pk}, name=name, description=name, is_custom=False, ) create_status(constants.STATUS_PLANNED, pgettext('activities-status', 'Planned')), create_status(constants.STATUS_IN_PROGRESS, pgettext('activities-status', 'In progress')), create_status(constants.STATUS_DONE, pgettext('activities-status', 'Done')), create_status(constants.STATUS_DELAYED, pgettext('activities-status', 'Delayed')), create_status(constants.STATUS_CANCELLED, pgettext('activities-status', 'Cancelled')), # --------------------------- act_types_info = { constants.ACTIVITYTYPE_TASK: { 'name': _('Task'), 'day': 0, 'hour': '00:15:00', }, constants.ACTIVITYTYPE_MEETING: { 'name': _('Meeting'), 'day': 0, 'hour': '00:15:00', }, constants.ACTIVITYTYPE_PHONECALL: { 'name': _('Phone call'), 'day': 0, 'hour': '00:15:00', }, constants.ACTIVITYTYPE_GATHERING: { 'name': _('Gathering'), 'day': 0, 'hour': '00:15:00', }, constants.ACTIVITYTYPE_SHOW: { 'name': _('Show'), 'day': 1, 'hour': '00:00:00', }, constants.ACTIVITYTYPE_DEMO: { 'name': _('Demonstration'), 'day': 0, 'hour': '01:00:00', }, constants.ACTIVITYTYPE_INDISPO: { 'name': _('Unavailability'), 'day': 1, 'hour': '00:00:00', }, } act_types = { pk: create_if_needed( ActivityType, {'pk': pk}, name=info['name'], default_day_duration=info['day'], default_hour_duration=info['hour'], is_custom=False, ) for pk, info in act_types_info.items() } def create_subtype(atype, pk, name): create_if_needed( ActivitySubType, {'pk': pk}, name=name, type=atype, is_custom=False, ) meeting_t = act_types[constants.ACTIVITYTYPE_MEETING] for pk, name in [ (constants.ACTIVITYSUBTYPE_MEETING_MEETING, _('Meeting')), (constants.ACTIVITYSUBTYPE_MEETING_QUALIFICATION, _('Qualification')), (constants.ACTIVITYSUBTYPE_MEETING_REVIVAL, _('Revival')), (constants.ACTIVITYSUBTYPE_MEETING_NETWORK, _('Network')), (constants.ACTIVITYSUBTYPE_MEETING_OTHER, pgettext('activities-meeting', 'Other')), ]: create_subtype(meeting_t, pk, name) pcall_t = act_types[constants.ACTIVITYTYPE_PHONECALL] for pk, name in [ (constants.ACTIVITYSUBTYPE_PHONECALL_INCOMING, _('Incoming')), (constants.ACTIVITYSUBTYPE_PHONECALL_OUTGOING, _('Outgoing')), (constants.ACTIVITYSUBTYPE_PHONECALL_CONFERENCE, _('Conference')), (constants.ACTIVITYSUBTYPE_PHONECALL_FAILED, _('Outgoing - Failed')), ]: create_subtype(pcall_t, pk, name) # --------------------------- HeaderFilter.objects.create_if_needed( pk=constants.DEFAULT_HFILTER_ACTIVITY, name=_('Activity view'), model=Activity, cells_desc=[ (EntityCellRegularField, { 'name': 'start' }), (EntityCellRegularField, { 'name': 'title' }), (EntityCellRegularField, { 'name': 'type' }), EntityCellRelation(model=Activity, rtype=rt_obj_part_2_activity), EntityCellRelation(model=Activity, rtype=rt_obj_activity_subject), (EntityCellRegularField, { 'name': 'user' }), (EntityCellRegularField, { 'name': 'end' }), ], ) # --------------------------- create_efilter = EntityFilter.objects.smart_update_or_create for pk, name, atype_id in [ (constants.EFILTER_MEETINGS, _('Meetings'), constants.ACTIVITYTYPE_MEETING), (constants.EFILTER_PHONECALLS, _('Phone calls'), constants.ACTIVITYTYPE_PHONECALL), (constants.EFILTER_TASKS, _('Tasks'), constants.ACTIVITYTYPE_TASK), ]: create_efilter( pk, name=name, model=Activity, is_custom=False, user='******', conditions=[ condition_handler.RegularFieldConditionHandler. build_condition( model=Activity, operator=operators.EqualsOperator, field_name='type', values=[atype_id], ), ], ) create_efilter( constants.EFILTER_PARTICIPATE, name=_('In which I participate'), model=Activity, is_custom=False, user='******', conditions=[ condition_handler.RelationSubFilterConditionHandler. build_condition( model=Activity, rtype=rt_obj_part_2_activity, subfilter=EntityFilter.objects.get_latest_version( FILTER_CONTACT_ME), ), ], ) # --------------------------- when_group = { 'name': _('When'), 'layout': LAYOUT_DUAL_SECOND, 'cells': [ act_forms.StartSubCell(model=Activity).into_cell(), act_forms.EndSubCell(model=Activity).into_cell(), (EntityCellRegularField, { 'name': 'is_all_day' }), ], } alerts_groups = [ { 'name': _('Generate an alert on a specific date'), 'layout': LAYOUT_DUAL_SECOND, 'cells': [ act_forms.DatetimeAlertSubCell(model=Activity).into_cell(), ], }, { 'name': _('Generate an alert in a while'), 'layout': LAYOUT_DUAL_SECOND, 'cells': [ act_forms.PeriodAlertSubCell(model=Activity).into_cell(), ], }, ] participants_group = { 'name': _('Participants & subjects'), 'cells': [ act_forms.MyParticipationSubCell(model=Activity).into_cell(), act_forms.ParticipatingUsersSubCell( model=Activity).into_cell(), act_forms.OtherParticipantsSubCell(model=Activity).into_cell(), act_forms.ActivitySubjectsSubCell(model=Activity).into_cell(), act_forms.LinkedEntitiesSubCell(model=Activity).into_cell(), ], } common_groups_desc = [ { 'name': _('Description'), 'cells': [ (EntityCellRegularField, { 'name': 'description' }), ], }, { 'name': _('Custom fields'), 'cells': [ ( EntityCellCustomFormSpecial, { 'name': EntityCellCustomFormSpecial.REMAINING_CUSTOMFIELDS }, ), ], }, ] relations_n_properties_groups = [ { 'name': _('Properties'), 'cells': [ ( EntityCellCustomFormSpecial, { 'name': EntityCellCustomFormSpecial.CREME_PROPERTIES }, ), ], }, { 'name': _('Relationships'), 'cells': [ ( EntityCellCustomFormSpecial, { 'name': EntityCellCustomFormSpecial.RELATIONS }, ), ], }, ] CustomFormConfigItem.objects.create_if_needed( descriptor=custom_forms.ACTIVITY_CREATION_CFORM, groups_desc=[ { 'name': _('General information'), 'layout': LAYOUT_DUAL_FIRST, 'cells': [ (EntityCellRegularField, { 'name': 'user' }), (EntityCellRegularField, { 'name': 'title' }), (EntityCellRegularField, { 'name': 'minutes' }), (EntityCellRegularField, { 'name': 'place' }), (EntityCellRegularField, { 'name': 'duration' }), (EntityCellRegularField, { 'name': 'status' }), (EntityCellRegularField, { 'name': 'busy' }), act_forms.ActivitySubTypeSubCell( model=Activity).into_cell(), # act_forms.CommercialApproachSubCell(model=Activity).into_cell(), ( EntityCellCustomFormSpecial, { 'name': EntityCellCustomFormSpecial. REMAINING_REGULARFIELDS }, ), ], }, when_group, *alerts_groups, participants_group, *common_groups_desc, *relations_n_properties_groups, # { # 'name': _('Users to keep informed'), # 'cells': [ # ( # act_forms.UserMessagesSubCell(model=Activity).into_cell(), # ), # ], # }, ], ) CustomFormConfigItem.objects.create_if_needed( descriptor=custom_forms.ACTIVITY_CREATION_FROM_CALENDAR_CFORM, groups_desc=[ { 'name': _('General information'), 'layout': LAYOUT_DUAL_FIRST, 'cells': [ (EntityCellRegularField, { 'name': 'user' }), (EntityCellRegularField, { 'name': 'title' }), # (EntityCellRegularField, {'name': 'minutes'}), (EntityCellRegularField, { 'name': 'place' }), (EntityCellRegularField, { 'name': 'duration' }), (EntityCellRegularField, { 'name': 'status' }), (EntityCellRegularField, { 'name': 'busy' }), act_forms.ActivitySubTypeSubCell( model=Activity).into_cell(), # act_forms.CommercialApproachSubCell(model=Activity).into_cell(), # NB: we do not want 'minutes' in the default form # ( # EntityCellCustomFormSpecial, # {'name': EntityCellCustomFormSpecial.REMAINING_REGULARFIELDS}, # ), ], }, when_group, *alerts_groups, participants_group, *common_groups_desc, *relations_n_properties_groups, ], ) CustomFormConfigItem.objects.create_if_needed( descriptor=custom_forms.UNAVAILABILITY_CREATION_FROM, groups_desc=[ { 'name': _('General information'), 'layout': LAYOUT_DUAL_FIRST, 'cells': [ (EntityCellRegularField, { 'name': 'user' }), (EntityCellRegularField, { 'name': 'title' }), act_forms.UnavailabilityTypeSubCell( model=Activity).into_cell(), ], }, when_group, { 'name': _('Unavailable users'), 'cells': [ act_forms.ParticipatingUsersSubCell( model=Activity).into_cell(), ], }, *common_groups_desc, *relations_n_properties_groups, ], ) CustomFormConfigItem.objects.create_if_needed( descriptor=custom_forms.ACTIVITY_EDITION_CFORM, groups_desc=[ { 'name': _('General information'), 'layout': LAYOUT_DUAL_FIRST, 'cells': [ (EntityCellRegularField, { 'name': 'user' }), (EntityCellRegularField, { 'name': 'title' }), (EntityCellRegularField, { 'name': 'minutes' }), (EntityCellRegularField, { 'name': 'place' }), (EntityCellRegularField, { 'name': 'duration' }), (EntityCellRegularField, { 'name': 'status' }), (EntityCellRegularField, { 'name': 'busy' }), act_forms.ActivitySubTypeSubCell( model=Activity).into_cell(), ( EntityCellCustomFormSpecial, { 'name': EntityCellCustomFormSpecial. REMAINING_REGULARFIELDS }, ), ], }, when_group, *common_groups_desc, ], ) # --------------------------- SearchConfigItem.objects.create_if_needed( Activity, ['title', 'description', 'type__name'], ) # --------------------------- create_svalue = SettingValue.objects.get_or_create create_svalue(key_id=setting_keys.review_key.id, defaults={'value': True}) create_svalue(key_id=setting_keys.auto_subjects_key.id, defaults={'value': True}) # create_svalue(key_id=setting_keys.form_user_messages_key.id, defaults={'value': False}) # --------------------------- # TODO: move to "not already_populated" section in creme2.4 if not MenuConfigItem.objects.filter( entry_id__startswith='activities-').exists(): create_mitem = MenuConfigItem.objects.create container = create_mitem( entry_id=ContainerEntry.id, entry_data={'label': _('Activities')}, order=10, ) create_mitem(entry_id=menu.CalendarEntry.id, order=10, parent=container) create_mitem(entry_id=menu.ActivitiesEntry.id, order=20, parent=container) create_mitem(entry_id=menu.PhoneCallsEntry.id, order=30, parent=container) create_mitem(entry_id=menu.MeetingsEntry.id, order=40, parent=container) # --------------------------- if not already_populated: LEFT = BrickDetailviewLocation.LEFT RIGHT = BrickDetailviewLocation.RIGHT BrickDetailviewLocation.objects.multi_create( defaults={ 'model': Activity, 'zone': LEFT }, data=[ { 'order': 5 }, { 'brick': core_bricks.CustomFieldsBrick, 'order': 40 }, { 'brick': bricks.RelatedCalendarBrick, 'order': 90 }, { 'brick': bricks.ParticipantsBrick, 'order': 100 }, { 'brick': bricks.SubjectsBrick, 'order': 120 }, { 'brick': core_bricks.PropertiesBrick, 'order': 450 }, { 'brick': core_bricks.RelationsBrick, 'order': 500 }, { 'brick': core_bricks.HistoryBrick, 'order': 20, 'zone': RIGHT }, ], ) if apps.is_installed('creme.assistants'): logger.info('Assistants app is installed' ' => we use the assistants blocks on detail views') from creme.assistants import bricks as a_bricks BrickDetailviewLocation.objects.multi_create( defaults={ 'model': Activity, 'zone': RIGHT }, data=[ { 'brick': a_bricks.TodosBrick, 'order': 100 }, { 'brick': a_bricks.MemosBrick, 'order': 200 }, { 'brick': a_bricks.AlertsBrick, 'order': 300 }, { 'brick': a_bricks.UserMessagesBrick, 'order': 400 }, ], ) if apps.is_installed('creme.documents'): # logger.info('Documents app is installed # => we use the documents block on detail views') from creme.documents.bricks import LinkedDocsBrick BrickDetailviewLocation.objects.create_if_needed( brick=LinkedDocsBrick, order=600, zone=RIGHT, model=Activity, ) future_id = bricks.FutureActivitiesBrick.id_ past_id = bricks.PastActivitiesBrick.id_ BrickDetailviewLocation.objects.multi_create( defaults={'zone': RIGHT}, data=[ { 'brick': future_id, 'order': 20, 'model': Contact }, { 'brick': past_id, 'order': 21, 'model': Contact }, { 'brick': future_id, 'order': 20, 'model': Organisation }, { 'brick': past_id, 'order': 21, 'model': Organisation }, ], ) BrickHomeLocation.objects.create(brick_id=future_id, order=20) BrickHomeLocation.objects.create(brick_id=past_id, order=21) # --------------------------- create_button = ButtonMenuItem.objects.create_if_needed create_button(button=buttons.AddRelatedActivityButton, order=10) create_button(button=buttons.AddMeetingButton, order=11) create_button(button=buttons.AddPhoneCallButton, order=12)
def create_quote_status(pk, name, **kwargs): create_if_needed(QuoteStatus, {'pk': pk}, name=name, **kwargs)
def populate(self): already_populated = RelationType.objects.filter( pk=constants.REL_SUB_RELATED_2_DOC, ).exists() Document = get_document_model() Folder = get_folder_model() RelationType.create( (constants.REL_SUB_RELATED_2_DOC, _('related to the document')), (constants.REL_OBJ_RELATED_2_DOC, _('document related to'), [Document]) ) # --------------------------- # TODO: pk string (or UUID) (+ move DOCUMENTS_FROM_EMAILS in 'emails' app) ?? entities_cat = create_if_needed( FolderCategory, {'pk': constants.DOCUMENTS_FROM_ENTITIES}, name=str(constants.DOCUMENTS_FROM_ENTITIES_NAME), is_custom=False, ) create_if_needed( FolderCategory, {'pk': constants.DOCUMENTS_FROM_EMAILS}, name=str(constants.DOCUMENTS_FROM_EMAILS_NAME), is_custom=False, ) # TODO: created by 'products' & 'persons' app ? create_doc_cat = DocumentCategory.objects.get_or_create create_doc_cat( uuid=constants.UUID_DOC_CAT_IMG_PRODUCT, defaults={ 'name': _('Product image'), 'is_custom': False, }, ) create_doc_cat( uuid=constants.UUID_DOC_CAT_IMG_ORGA, defaults={ 'name': _('Organisation logo'), 'is_custom': False, }, ) create_doc_cat( uuid=constants.UUID_DOC_CAT_IMG_CONTACT, defaults={ 'name': _('Contact photograph'), 'is_custom': False, }, ) # --------------------------- user = get_user_model().objects.get_admin() if not folder_model_is_custom(): get_create_folder = Folder.objects.get_or_create get_create_folder( uuid=constants.UUID_FOLDER_RELATED2ENTITIES, defaults={ 'user': user, 'title': 'Creme', 'category': entities_cat, 'description': _('Folder containing all the documents related to entities'), }, ) get_create_folder( uuid=constants.UUID_FOLDER_IMAGES, defaults={ 'user': user, 'title': _('Images'), } ) # --------------------------- create_hf = HeaderFilter.objects.create_if_needed create_hf( pk=constants.DEFAULT_HFILTER_DOCUMENT, model=Document, name=_('Document view'), cells_desc=[ (EntityCellRegularField, {'name': 'title'}), (EntityCellRegularField, {'name': 'linked_folder__title'}), (EntityCellRegularField, {'name': 'mime_type'}), ], ) create_hf( pk=constants.DEFAULT_HFILTER_FOLDER, model=Folder, name=_('Folder view'), cells_desc=[ (EntityCellRegularField, {'name': 'title'}), (EntityCellRegularField, {'name': 'description'}), (EntityCellRegularField, {'name': 'category'}), ], ) # --------------------------- EntityFilter.objects.smart_update_or_create( constants.EFILTER_IMAGES, name=_('Images'), model=Document, is_custom=False, user='******', conditions=[ condition_handler.RegularFieldConditionHandler.build_condition( model=Document, operator=operators.StartsWithOperator, field_name='mime_type__name', values=[constants.MIMETYPE_PREFIX_IMG], ), ], ) # --------------------------- common_groups_desc = [ { 'name': _('Description'), 'layout': LAYOUT_DUAL_SECOND, 'cells': [ (EntityCellRegularField, {'name': 'description'}), ], }, { 'name': _('Custom fields'), 'layout': LAYOUT_DUAL_SECOND, 'cells': [ ( EntityCellCustomFormSpecial, {'name': EntityCellCustomFormSpecial.REMAINING_CUSTOMFIELDS}, ), ], }, ] creation_only_groups_desc = [ { 'name': _('Properties'), 'cells': [ ( EntityCellCustomFormSpecial, {'name': EntityCellCustomFormSpecial.CREME_PROPERTIES}, ), ], }, { 'name': _('Relationships'), 'cells': [ ( EntityCellCustomFormSpecial, {'name': EntityCellCustomFormSpecial.RELATIONS}, ), ], }, ] base_folder_groups_desc = [ { 'name': _('General information'), 'layout': LAYOUT_DUAL_FIRST, 'cells': [ (EntityCellRegularField, {'name': 'user'}), (EntityCellRegularField, {'name': 'title'}), (EntityCellRegularField, {'name': 'parent_folder'}), (EntityCellRegularField, {'name': 'category'}), ( EntityCellCustomFormSpecial, {'name': EntityCellCustomFormSpecial.REMAINING_REGULARFIELDS}, ), ], }, *common_groups_desc, ] CustomFormConfigItem.objects.create_if_needed( descriptor=custom_forms.FOLDER_CREATION_CFORM, groups_desc=[ *base_folder_groups_desc, *creation_only_groups_desc, ], ) CustomFormConfigItem.objects.create_if_needed( descriptor=custom_forms.FOLDER_EDITION_CFORM, groups_desc=base_folder_groups_desc, ) CustomFormConfigItem.objects.create_if_needed( descriptor=custom_forms.DOCUMENT_CREATION_CFORM, groups_desc=[ { 'name': _('General information'), 'layout': LAYOUT_DUAL_FIRST, 'cells': [ (EntityCellRegularField, {'name': 'user'}), (EntityCellRegularField, {'name': 'title'}), (EntityCellRegularField, {'name': 'filedata'}), (EntityCellRegularField, {'name': 'linked_folder'}), (EntityCellRegularField, {'name': 'categories'}), ( EntityCellCustomFormSpecial, {'name': EntityCellCustomFormSpecial.REMAINING_REGULARFIELDS}, ), ], }, *common_groups_desc, *creation_only_groups_desc, ], ) CustomFormConfigItem.objects.create_if_needed( descriptor=custom_forms.DOCUMENT_EDITION_CFORM, groups_desc=[ { 'name': _('General information'), 'layout': LAYOUT_DUAL_FIRST, 'cells': [ (EntityCellRegularField, {'name': 'user'}), (EntityCellRegularField, {'name': 'title'}), (EntityCellRegularField, {'name': 'linked_folder'}), (EntityCellRegularField, {'name': 'categories'}), ( EntityCellCustomFormSpecial, {'name': EntityCellCustomFormSpecial.REMAINING_REGULARFIELDS}, ), ], }, *common_groups_desc, ], ) # --------------------------- create_sci = SearchConfigItem.objects.create_if_needed create_sci(Document, ['title', 'description', 'linked_folder__title', 'categories__name']) create_sci(Folder, ['title', 'description', 'category__name']) # --------------------------- # TODO: move to "not already_populated" section in creme2.4 if not MenuConfigItem.objects.filter(entry_id__startswith='documents-').exists(): container = MenuConfigItem.objects.get_or_create( entry_id=ContainerEntry.id, entry_data={'label': _('Tools')}, defaults={'order': 100}, )[0] create_mitem = partial(MenuConfigItem.objects.create, parent=container) create_mitem(entry_id=menu.DocumentsEntry.id, order=10) create_mitem(entry_id=menu.FoldersEntry.id, order=20) # --------------------------- if not already_populated: RIGHT = BrickDetailviewLocation.RIGHT BrickDetailviewLocation.objects.multi_create( defaults={'model': Folder, 'zone': BrickDetailviewLocation.LEFT}, data=[ {'order': 5}, # generic info brick {'brick': core_bricks.CustomFieldsBrick, 'order': 40}, {'brick': bricks.ChildFoldersBrick, 'order': 50}, {'brick': bricks.FolderDocsBrick, 'order': 60}, {'brick': core_bricks.PropertiesBrick, 'order': 450}, {'brick': core_bricks.RelationsBrick, 'order': 500}, {'brick': core_bricks.HistoryBrick, 'order': 20, 'zone': RIGHT}, ], ) if apps.is_installed('creme.assistants'): logger.info( 'Assistants app is installed' ' => we use the assistants blocks on detail view' ) from creme.assistants import bricks as a_bricks BrickDetailviewLocation.objects.multi_create( defaults={'zone': RIGHT}, data=[ {'brick': a_bricks.TodosBrick, 'order': 100}, {'brick': a_bricks.MemosBrick, 'order': 200}, {'brick': a_bricks.AlertsBrick, 'order': 300}, {'brick': a_bricks.UserMessagesBrick, 'order': 400}, ], )
def populate(self): already_populated = RelationType.objects.filter( pk=constants.REL_SUB_PROJECT_MANAGER, ).exists() Contact = get_contact_model() Activity = get_activity_model() Project = get_project_model() ProjectTask = get_task_model() create_rtype = RelationType.create create_rtype( ( constants.REL_SUB_PROJECT_MANAGER, _('is one of the leaders of this project'), [Contact], ), ( constants.REL_OBJ_PROJECT_MANAGER, _('has as leader'), [Project], ), ) create_rtype( ( constants.REL_SUB_LINKED_2_PTASK, _('is related to the task of project'), [Activity], ), ( constants.REL_OBJ_LINKED_2_PTASK, _('includes the activity'), [ProjectTask], ), is_internal=True, minimal_display=(False, True), ) create_rtype( (constants.REL_SUB_PART_AS_RESOURCE, _('is a resource of'), [Contact]), (constants.REL_OBJ_PART_AS_RESOURCE, _('has as a resource'), [Activity]), is_internal=True, ) # --------------------------- for pk, statusdesc in constants.TASK_STATUS.items(): create_if_needed( TaskStatus, {'pk': pk}, name=str(statusdesc.name), order=pk, description=str(statusdesc.verbose_name), is_custom=False, ) # --------------------------- create_hf = HeaderFilter.objects.create_if_needed create_hf( pk=constants.DEFAULT_HFILTER_PROJECT, model=Project, name=_('Project view'), cells_desc=[ (EntityCellRegularField, { 'name': 'name' }), (EntityCellRegularField, { 'name': 'start_date' }), (EntityCellRegularField, { 'name': 'end_date' }), (EntityCellRegularField, { 'name': 'status' }), (EntityCellRegularField, { 'name': 'description' }), ], ) # Used in form create_hf( pk='projects-hf_task', name=_('Task view'), model=ProjectTask, cells_desc=[ (EntityCellRegularField, { 'name': 'title' }), (EntityCellRegularField, { 'name': 'description' }), ], ) # --------------------------- common_groups_desc = [ { 'name': _('Description'), 'layout': LAYOUT_DUAL_SECOND, 'cells': [ (EntityCellRegularField, { 'name': 'description' }), ], }, { 'name': _('Custom fields'), 'layout': LAYOUT_DUAL_SECOND, 'cells': [ ( EntityCellCustomFormSpecial, { 'name': EntityCellCustomFormSpecial.REMAINING_CUSTOMFIELDS }, ), ], }, ] only_creation_groups_desc = [ { 'name': _('Properties'), 'cells': [ ( EntityCellCustomFormSpecial, { 'name': EntityCellCustomFormSpecial.CREME_PROPERTIES }, ), ], }, { 'name': _('Relationships'), 'cells': [ ( EntityCellCustomFormSpecial, { 'name': EntityCellCustomFormSpecial.RELATIONS }, ), ], }, ] CustomFormConfigItem.objects.create_if_needed( descriptor=custom_forms.PROJECT_CREATION_CFORM, groups_desc=[ { 'name': _('General information'), 'layout': LAYOUT_DUAL_FIRST, 'cells': [ (EntityCellRegularField, { 'name': 'user' }), (EntityCellRegularField, { 'name': 'name' }), (EntityCellRegularField, { 'name': 'status' }), ProjectLeadersSubCell(model=Project).into_cell(), (EntityCellRegularField, { 'name': 'start_date' }), (EntityCellRegularField, { 'name': 'end_date' }), (EntityCellRegularField, { 'name': 'currency' }), ( EntityCellCustomFormSpecial, { 'name': EntityCellCustomFormSpecial. REMAINING_REGULARFIELDS }, ), ], }, *common_groups_desc, *only_creation_groups_desc, ], ) CustomFormConfigItem.objects.create_if_needed( descriptor=custom_forms.PROJECT_EDITION_CFORM, groups_desc=[ { 'name': _('General information'), 'layout': LAYOUT_DUAL_FIRST, 'cells': [ (EntityCellRegularField, { 'name': 'user' }), (EntityCellRegularField, { 'name': 'name' }), (EntityCellRegularField, { 'name': 'status' }), (EntityCellRegularField, { 'name': 'start_date' }), (EntityCellRegularField, { 'name': 'end_date' }), (EntityCellRegularField, { 'name': 'currency' }), ( EntityCellCustomFormSpecial, { 'name': EntityCellCustomFormSpecial. REMAINING_REGULARFIELDS }, ), ], }, *common_groups_desc, ], ) task_rfields_cells = [ (EntityCellRegularField, { 'name': 'user' }), (EntityCellRegularField, { 'name': 'title' }), (EntityCellRegularField, { 'name': 'start' }), (EntityCellRegularField, { 'name': 'end' }), (EntityCellRegularField, { 'name': 'duration' }), (EntityCellRegularField, { 'name': 'tstatus' }), ] CustomFormConfigItem.objects.create_if_needed( descriptor=custom_forms.TASK_CREATION_CFORM, groups_desc=[ { 'name': _('General information'), 'cells': [ *task_rfields_cells, ParentTasksSubCell(model=ProjectTask).into_cell(), ( EntityCellCustomFormSpecial, { 'name': EntityCellCustomFormSpecial. REMAINING_REGULARFIELDS }, ), ], }, *common_groups_desc, *only_creation_groups_desc, ], ) CustomFormConfigItem.objects.create_if_needed( descriptor=custom_forms.TASK_EDITION_CFORM, groups_desc=[ { 'name': _('General information'), 'cells': [ *task_rfields_cells, ( EntityCellCustomFormSpecial, { 'name': EntityCellCustomFormSpecial. REMAINING_REGULARFIELDS }, ), ], }, *common_groups_desc, ], ) # --------------------------- create_searchconf = SearchConfigItem.objects.create_if_needed create_searchconf( Project, ['name', 'description', 'status__name'], ) create_searchconf( ProjectTask, ['linked_project__name', 'duration', 'tstatus__name'], ) # --------------------------- # TODO: move to "not already_populated" section in creme2.4 if not MenuConfigItem.objects.filter( entry_id__startswith='projects-').exists(): container = MenuConfigItem.objects.get_or_create( entry_id=ContainerEntry.id, entry_data={'label': _('Tools')}, defaults={'order': 100}, )[0] MenuConfigItem.objects.create( entry_id=ProjectsEntry.id, parent=container, order=50, ) # --------------------------- if not already_populated: for pk, (name, description) in enumerate([ ( _('Invitation to tender'), _('Response to an invitation to tender'), ), ( _('Initialization'), _('The project is starting'), ), ( _('Preliminary phase'), _('The project is in the process of analysis and design'), ), ( _('Achievement'), _('The project is being implemented'), ), ( _('Tests'), _('The project is in the testing process (unit / integration / functional)' ), ), ( _('User acceptance tests'), _('The project is in the user acceptance testing process'), ), (_('Finished'), _('The project is finished')), ], start=1): create_if_needed( ProjectStatus, {'pk': pk}, name=name, order=pk, description=description, ) # --------------------------- TOP = BrickDetailviewLocation.TOP LEFT = BrickDetailviewLocation.LEFT RIGHT = BrickDetailviewLocation.RIGHT BrickDetailviewLocation.objects.multi_create( defaults={ 'model': Project, 'zone': LEFT }, data=[ { 'brick': bricks.ProjectTasksBrick, 'order': 2, 'zone': TOP }, { 'order': 5 }, { 'brick': bricks.ProjectExtraInfoBrick, 'order': 30 }, { 'brick': core_bricks.CustomFieldsBrick, 'order': 40 }, { 'brick': core_bricks.PropertiesBrick, 'order': 450 }, { 'brick': core_bricks.RelationsBrick, 'order': 500 }, { 'brick': core_bricks.HistoryBrick, 'order': 20, 'zone': RIGHT }, ], ) BrickDetailviewLocation.objects.multi_create( defaults={ 'model': ProjectTask, 'zone': LEFT }, data=[ { 'brick': bricks.TaskResourcesBrick, 'order': 2, 'zone': TOP }, { 'brick': bricks.TaskActivitiesBrick, 'order': 4, 'zone': TOP }, { 'order': 5 }, { 'brick': bricks.TaskExtraInfoBrick, 'order': 30 }, { 'brick': core_bricks.CustomFieldsBrick, 'order': 40 }, { 'brick': bricks.ParentTasksBrick, 'order': 50 }, { 'brick': core_bricks.PropertiesBrick, 'order': 450 }, { 'brick': core_bricks.RelationsBrick, 'order': 500 }, { 'brick': core_bricks.HistoryBrick, 'order': 20, 'zone': RIGHT }, ], ) if apps.is_installed('creme.assistants'): logger.info('Assistants app is installed' ' => we use the assistants blocks on detail views') from creme.assistants import bricks as a_bricks for model in (Project, ProjectTask): BrickDetailviewLocation.objects.multi_create( defaults={ 'model': model, 'zone': RIGHT }, data=[ { 'brick': a_bricks.TodosBrick, 'order': 100 }, { 'brick': a_bricks.MemosBrick, 'order': 200 }, { 'brick': a_bricks.AlertsBrick, 'order': 300 }, { 'brick': a_bricks.UserMessagesBrick, 'order': 400 }, ], ) if apps.is_installed('creme.documents'): # logger.info('Documents app is installed # => we use the documents block on detail views') from creme.documents.bricks import LinkedDocsBrick BrickDetailviewLocation.objects.multi_create( defaults={ 'brick': LinkedDocsBrick, 'order': 600, 'zone': RIGHT }, data=[{ 'model': model } for model in (Project, ProjectTask)], )
def populate(self, *args, **kwargs): PollCampaign = polls.get_pollcampaign_model() PollForm = polls.get_pollform_model() PollReply = polls.get_pollreply_model() Contact = persons.get_contact_model() Organisation = persons.get_organisation_model() create_hf = HeaderFilter.create create_hf( pk=constants.DEFAULT_HFILTER_PFORM, model=PollForm, name=_('Form view'), cells_desc=[ (EntityCellRegularField, { 'name': 'name' }), ], ) create_hf( pk=constants.DEFAULT_HFILTER_PREPLY, model=PollReply, name=_('Reply view'), cells_desc=[ (EntityCellRegularField, { 'name': 'name' }), (EntityCellRegularField, { 'name': 'pform' }), (EntityCellRegularField, { 'name': 'person' }), ], ) create_hf( pk=constants.DEFAULT_HFILTER_PCAMPAIGN, model=PollCampaign, name=_('Campaign view'), cells_desc=[ (EntityCellRegularField, { 'name': 'name' }), (EntityCellRegularField, { 'name': 'due_date' }), (EntityCellRegularField, { 'name': 'segment' }), ], ) # --------------------------- create_searchconf = SearchConfigItem.create_if_needed create_searchconf(PollForm, ['name']) create_searchconf(PollReply, ['name']) create_searchconf(PollCampaign, ['name']) # --------------------------- if not PollType.objects.exists( ): # NB: no straightforward way to test that this populate script has not been already run create_if_needed(PollType, {'pk': 1}, name=_('Survey')) create_if_needed(PollType, {'pk': 2}, name=_('Monitoring')) create_if_needed(PollType, {'pk': 3}, name=_('Assessment')) # --------------------------- # NB: no straightforward way to test that this populate script has not been already run if not BrickDetailviewLocation.objects.filter_for_model( PollForm).exists(): TOP = BrickDetailviewLocation.TOP LEFT = BrickDetailviewLocation.LEFT RIGHT = BrickDetailviewLocation.RIGHT create_bdl = BrickDetailviewLocation.objects.create_if_needed create_bdl_4_model = BrickDetailviewLocation.objects.create_for_model_brick create_bdl(brick=bricks.PollFormLinesBrick, order=5, zone=TOP, model=PollForm) create_bdl_4_model(order=5, zone=LEFT, model=PollForm) create_bdl(brick=core_bricks.CustomFieldsBrick, order=40, zone=LEFT, model=PollForm) create_bdl(brick=core_bricks.PropertiesBrick, order=450, zone=LEFT, model=PollForm) create_bdl(brick=core_bricks.RelationsBrick, order=500, zone=LEFT, model=PollForm) create_bdl(brick=bricks.PollRepliesBrick, order=5, zone=RIGHT, model=PollForm) create_bdl(brick=core_bricks.HistoryBrick, order=20, zone=RIGHT, model=PollForm) # TODO: factorise create_bdl(brick=bricks.PollReplyLinesBrick, order=5, zone=TOP, model=PollReply) create_bdl_4_model(order=5, zone=LEFT, model=PollReply) create_bdl(brick=core_bricks.CustomFieldsBrick, order=40, zone=LEFT, model=PollReply) create_bdl(brick=core_bricks.PropertiesBrick, order=450, zone=LEFT, model=PollReply) create_bdl(brick=core_bricks.RelationsBrick, order=500, zone=LEFT, model=PollReply) create_bdl(brick=core_bricks.HistoryBrick, order=20, zone=RIGHT, model=PollReply) create_bdl_4_model(order=5, zone=LEFT, model=PollCampaign) create_bdl(brick=core_bricks.CustomFieldsBrick, order=40, zone=LEFT, model=PollCampaign) create_bdl(brick=core_bricks.PropertiesBrick, order=450, zone=LEFT, model=PollCampaign) create_bdl(brick=core_bricks.RelationsBrick, order=500, zone=LEFT, model=PollCampaign) create_bdl(brick=bricks.PollCampaignRepliesBrick, order=5, zone=RIGHT, model=PollCampaign) create_bdl(brick=core_bricks.HistoryBrick, order=20, zone=RIGHT, model=PollCampaign) create_bdl(brick=bricks.PersonPollRepliesBrick, order=500, zone=RIGHT, model=Contact) create_bdl(brick=bricks.PersonPollRepliesBrick, order=500, zone=RIGHT, model=Organisation) if apps.is_installed('creme.assistants'): logger.info( 'Assistants app is installed => we use the assistants blocks on detail view' ) from creme.assistants import bricks as a_bricks for model in (PollForm, PollReply, PollCampaign): create_bdl(brick=a_bricks.TodosBrick, order=100, zone=RIGHT, model=model) create_bdl(brick=a_bricks.MemosBrick, order=200, zone=RIGHT, model=model) create_bdl(brick=a_bricks.AlertsBrick, order=300, zone=RIGHT, model=model) create_bdl(brick=a_bricks.UserMessagesBrick, order=400, zone=RIGHT, model=model) if apps.is_installed('creme.documents'): # logger.info('Documents app is installed => we use the documents block on detail views') from creme.documents.bricks import LinkedDocsBrick for model in (PollForm, PollReply, PollCampaign): create_bdl(brick=LinkedDocsBrick, order=600, zone=RIGHT, model=model)