예제 #1
0
 def create_subtype(atype, pk, name):
     create_if_needed(
         ActivitySubType,
         {'pk': pk},
         name=name,
         type=atype,
         is_custom=False,
     )
예제 #2
0
 def create_status(pk, name):
     create_if_needed(
         Status,
         {'pk': pk},
         name=name,
         description=name,
         is_custom=False,
     )
예제 #3
0
    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)
예제 #4
0
    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)
예제 #5
0
    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)
예제 #6
0
    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,
                )
예제 #7
0
    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"
                    )
예제 #8
0
    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)
예제 #9
0
    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)
예제 #10
0
    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,
                )
예제 #11
0
 def create_cnote_status(pk, name, **kwargs):
     create_if_needed(CreditNoteStatus, {'pk': pk}, name=name, **kwargs)
예제 #12
0
 def create_order_status(pk, name, **kwargs):
     create_if_needed(SalesOrderStatus, {'pk': pk}, name=name, **kwargs)
예제 #13
0
    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,
                                   )
예제 #14
0
    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,
                )
예제 #15
0
    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)],
                )
예제 #16
0
    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)
예제 #17
0
    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
                        },
                    ],
                )
예제 #18
0
    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)
예제 #19
0
    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)
예제 #20
0
    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)
예제 #21
0
    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)
예제 #22
0
 def create_invoice_status(pk, name, **kwargs):
     create_if_needed(InvoiceStatus, {'pk': pk}, name=name, **kwargs)
예제 #23
0
    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)
예제 #24
0
 def create_quote_status(pk, name, **kwargs):
     create_if_needed(QuoteStatus, {'pk': pk}, name=name, **kwargs)
예제 #25
0
    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},
                    ],
                )
예제 #26
0
    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)],
                )
예제 #27
0
    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)