Esempio n. 1
0
 def test_create_detailview06(self):
     "Default configuration cannot have a related role"
     with self.assertRaises(ValueError):
         BrickDetailviewLocation.create_if_needed(
                 brick_id=PropertiesBrick.id_,
                 order=5, zone=BrickDetailviewLocation.RIGHT,
                 model=None, role='superuser', # <==
         )
Esempio n. 2
0
    def setUpClass(cls):
        # super(ImprintViewsTestCase, cls).setUpClass()
        super().setUpClass()

        BrickDetailviewLocation.create_if_needed(
            brick_id=ImprintsBrick.id_,
            order=1,
            zone=BrickDetailviewLocation.LEFT,
        )
        # BlockPortalLocation.create_or_update(brick_id=ImprintsBrick.id_, order=1, app_name='creme_core')
        BrickHomeLocation.objects.create(brick_id=ImprintsBrick.id_, order=1)
Esempio n. 3
0
    def test_create_detailview02(self):
        "For a ContentType"
        self.assertFalse(BrickDetailviewLocation.config_exists(FakeContact))

        order = 4
        zone = BrickDetailviewLocation.LEFT
        brick_id = PropertiesBrick.id_
        loc = BrickDetailviewLocation.create_if_needed(brick_id=brick_id, order=order, zone=zone, model=FakeContact)
        loc = self.get_object_or_fail(BrickDetailviewLocation, pk=loc.pk)
        self.assertEqual(FakeContact, loc.content_type.model_class())
        self.assertEqual(brick_id, loc.brick_id)
        self.assertEqual(order,    loc.order)
        self.assertEqual(zone,     loc.zone)

        self.assertTrue(BrickDetailviewLocation.config_exists(FakeContact))
Esempio n. 4
0
 def test_create_4_model_brick02(self):
     "model = None"
     loc = BrickDetailviewLocation.create_4_model_brick(
             order=8, zone=BrickDetailviewLocation.BOTTOM, model=None,
     )
     self.assertEqual(1, BrickDetailviewLocation.objects.count())
     self.assertEqual('modelblock', loc.brick_id)
     self.assertIsNone(loc.content_type)
Esempio n. 5
0
 def test_create_4_model_brick03(self):
     "With a Role"
     role = UserRole.objects.create(name='Viewer')
     loc = BrickDetailviewLocation.create_4_model_brick(
             model=FakeContact, role=role,
             order=8, zone=BrickDetailviewLocation.BOTTOM,
     )
     self.assertEqual(1, BrickDetailviewLocation.objects.count())
     self.assertEqual('modelblock', loc.brick_id)
     self.assertEqual(role,         loc.role)
Esempio n. 6
0
    def test_brick_orga03(self):
        "Statistics"
        self.login()

        orga = Organisation.objects.create(user=self.user, name='NERV')
        brick_id = bricks.PersonsStatisticsBrick.id_

        BrickDetailviewLocation.create_if_needed(
            brick_id=brick_id,
            order=1000,
            zone=BrickDetailviewLocation.LEFT,
            model=Organisation,
        )

        response = self.assertGET200(orga.get_absolute_url())
        self.assertTemplateUsed(response,
                                'billing/bricks/persons-statistics.html')

        tree = self.get_html_tree(response.content)
        self.get_brick_node(tree, brick_id)
Esempio n. 7
0
    def test_display_custombrick03(self):
        "With FieldsConfig on sub-fields"
        user = self.login()

        hidden_fname = 'zipcode'
        FieldsConfig.create(
            FakeAddress,
            descriptions=[(hidden_fname, {
                FieldsConfig.HIDDEN: True
            })],
        )
        build_cell = EntityCellRegularField.build
        cbc_item = CustomBrickConfigItem.objects.create(
            id='tests-contacts1',
            name='Contact info',
            content_type=ContentType.objects.get_for_model(FakeContact),
            cells=[
                build_cell(FakeContact, 'last_name'),
                build_cell(FakeContact, 'address__' + hidden_fname),
                build_cell(FakeContact, 'address__city'),
            ],
        )
        bdl = BrickDetailviewLocation.create_if_needed(
            brick_id=cbc_item.generate_id(),
            order=1000,  # Should be the last block
            model=FakeContact,
            zone=BrickDetailviewLocation.BOTTOM,
        )
        naru = FakeContact.objects.create(
            user=user,
            last_name='Narusegawa',
            first_name='Naru',
            phone='1122334455',
        )
        naru.address = FakeAddress.objects.create(
            value='Hinata Inn',
            city='Tokyo',
            zipcode='112233',
            entity=naru,
        )
        naru.save()

        content_node = self._get_contact_brick_content(naru,
                                                       brick_id=bdl.brick_id)
        self.assertEqual(
            naru.last_name,
            self.get_brick_tile(content_node, 'regular_field-last_name').text)
        self.assertEqual(
            naru.address.city,
            self.get_brick_tile(content_node,
                                'regular_field-address__city').text)
        self._assertNoBrickTile(content_node, 'regular_field-address__zipcode')
Esempio n. 8
0
    def test_create_4_model_brick01(self):
        order = 5
        zone = BrickDetailviewLocation.RIGHT
        model = FakeContact
        loc = BrickDetailviewLocation.create_4_model_brick(order=order, zone=zone, model=model)

        self.assertEqual(1, BrickDetailviewLocation.objects.count())

        loc = self.get_object_or_fail(BrickDetailviewLocation, pk=loc.id)
        self.assertEqual('modelblock', loc.brick_id)
        self.assertEqual(model,        loc.content_type.model_class())
        self.assertEqual(order,        loc.order)
        self.assertEqual(zone,         loc.zone)
Esempio n. 9
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)
Esempio n. 10
0
    def test_create_detailview01(self):  # DEPRECATED
        "Default configuration."
        order = 25
        zone = BrickDetailviewLocation.TOP
        brick_id = RelationsBrick.id_
        loc = BrickDetailviewLocation.create_if_needed(brick_id=brick_id,
                                                       order=order,
                                                       zone=zone)
        self.assertIsInstance(loc, BrickDetailviewLocation)

        loc = self.get_object_or_fail(BrickDetailviewLocation, pk=loc.pk)
        self.assertIsNone(loc.content_type)
        self.assertEqual(brick_id, loc.brick_id)
        self.assertEqual(order, loc.order)
        self.assertEqual(zone, loc.zone)
Esempio n. 11
0
 def save(self, *args, **kwargs):
     cdata = self.cleaned_data
     hat_brick_id = cdata.get('hat')
     locations = cdata["locations"]
     self._save_locations(
         BrickDetailviewLocation,
         lambda: BrickDetailviewLocation(content_type=self.ct),
         bricks_partitions={
             BrickDetailviewLocation.HAT:    [hat_brick_id] if hat_brick_id else [],
             BrickDetailviewLocation.TOP:    locations['top'],
             BrickDetailviewLocation.LEFT:   locations['left'],
             BrickDetailviewLocation.RIGHT:  locations['right'],
             BrickDetailviewLocation.BOTTOM: locations['bottom'],
         },
         old_locations=self.locations,
         role=self.role, superuser=self.superuser,
     )
Esempio n. 12
0
    def test_display_custombrick02(self):
        "With FieldsConfig"
        user = self.login()

        hidden_fname = 'phone'
        FieldsConfig.create(
            FakeContact,
            descriptions=[(hidden_fname, {
                FieldsConfig.HIDDEN: True
            })],
        )
        build_cell = EntityCellRegularField.build
        cbc_item = CustomBrickConfigItem.objects.create(
            id='tests-contacts1',
            name='Contact info',
            content_type=ContentType.objects.get_for_model(FakeContact),
            cells=[
                build_cell(FakeContact, 'last_name'),
                build_cell(FakeContact, hidden_fname),
            ],
        )
        bdl = BrickDetailviewLocation.create_if_needed(
            brick_id=cbc_item.generate_id(),
            order=1000,
            model=FakeContact,
            zone=BrickDetailviewLocation.BOTTOM,
        )
        naru = FakeContact.objects.create(
            user=user,
            last_name='Narusegawa',
            first_name='Naru',
            phone='1122334455',
        )

        content_node = self._get_contact_brick_content(naru,
                                                       brick_id=bdl.brick_id)
        self.assertEqual(
            naru.last_name,
            self.get_brick_tile(content_node, 'regular_field-last_name').text)
        self._assertNoBrickTile(content_node, 'regular_field-phone')
Esempio n. 13
0
    def test_display_custombrick01(self):
        user = self.login()

        fname1 = 'last_name'
        fname2 = 'phone'
        build_cell = EntityCellRegularField.build
        cbc_item = CustomBrickConfigItem.objects.create(
            id='tests-contacts1',
            name='Contact info',
            content_type=ContentType.objects.get_for_model(FakeContact),
            cells=[
                build_cell(FakeContact, fname1),
                build_cell(FakeContact, fname2),
            ],
        )
        bdl = BrickDetailviewLocation.create_if_needed(
            brick_id=cbc_item.generate_id(),
            order=1000,
            model=FakeContact,
            zone=BrickDetailviewLocation.BOTTOM,
        )
        naru = FakeContact.objects.create(
            user=user,
            last_name='Narusegawa',
            first_name='Naru',
            phone='1122334455',
        )

        content_node = self._get_contact_brick_content(naru,
                                                       brick_id=bdl.brick_id)
        self.assertEqual(
            naru.last_name,
            self.get_brick_tile(content_node, 'regular_field-last_name').text)
        self.assertIn(
            naru.phone,
            self.get_brick_tile(content_node, 'regular_field-phone').text)
Esempio n. 14
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)
Esempio n. 15
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)
Esempio n. 16
0
    def populate(self):
        already_populated = RelationType.objects.filter(
            pk=constants.REL_SUB_MAIL_RECEIVED).exists()

        EmailCampaign = emails.get_emailcampaign_model()
        EmailTemplate = emails.get_emailtemplate_model()
        EntityEmail = emails.get_entityemail_model()
        MailingList = emails.get_mailinglist_model()

        Contact = persons.get_contact_model()
        Organisation = persons.get_organisation_model()

        # ---------------------------
        SettingValue.objects.get_or_create(key_id=emailcampaign_sender.id,
                                           defaults={'value': ''})

        # ---------------------------
        RelationType.create(
            (constants.REL_SUB_MAIL_RECEIVED, _(u'(email) received by'),
             [EntityEmail]),
            (constants.REL_OBJ_MAIL_RECEIVED, _(u'received the email'),
             [Organisation, Contact]))
        RelationType.create((constants.REL_SUB_MAIL_SENDED,
                             _(u'(email) sent by'), [EntityEmail]),
                            (constants.REL_OBJ_MAIL_SENDED,
                             _(u'sent the email'), [Organisation, Contact]))
        RelationType.create(
            (constants.REL_SUB_RELATED_TO, _(u'(email) related to'),
             [EntityEmail]),
            (constants.REL_OBJ_RELATED_TO, _(u'related to the email'), []))

        # ---------------------------
        create_hf = HeaderFilter.create
        create_hf(
            pk=constants.DEFAULT_HFILTER_MAILINGLIST,
            model=MailingList,
            name=_(u'Mailing list view'),
            cells_desc=[(EntityCellRegularField, {
                'name': 'name'
            })],
        )
        create_hf(
            pk=constants.DEFAULT_HFILTER_CAMPAIGN,
            model=EmailCampaign,
            name=_(u'Campaign view'),
            cells_desc=[(EntityCellRegularField, {
                'name': 'name'
            })],
        )
        create_hf(
            pk=constants.DEFAULT_HFILTER_TEMPLATE,
            model=EmailTemplate,
            name=_(u'Email template view'),
            cells_desc=[
                (EntityCellRegularField, {
                    'name': 'name'
                }),
                (EntityCellRegularField, {
                    'name': 'subject'
                }),
            ],
        )
        create_hf(
            pk=constants.DEFAULT_HFILTER_EMAIL,
            model=EntityEmail,
            name=_(u'Email view'),
            cells_desc=[
                (EntityCellRegularField, {
                    'name': 'sender'
                }),
                (EntityCellRegularField, {
                    'name': 'recipient'
                }),
                (EntityCellRegularField, {
                    'name': 'subject'
                }),
            ],
        )

        # ---------------------------
        create_searchconf = SearchConfigItem.create_if_needed
        create_searchconf(EmailCampaign, ['name', 'mailing_lists__name'])
        create_searchconf(MailingList, [
            'name', 'children__name', 'contacts__first_name',
            'contacts__last_name', 'organisations__name'
        ])
        create_searchconf(EmailTemplate,
                          ['name', 'subject', 'body', 'attachments__title'])
        create_searchconf(EntityEmail, ['sender', 'recipient', 'subject'])

        # ---------------------------
        create_job = Job.objects.get_or_create
        create_job(type_id=entity_emails_send_type.id,
                   defaults={
                       'language': settings.LANGUAGE_CODE,
                       'status': Job.STATUS_OK,
                   })
        create_job(type_id=campaign_emails_send_type.id,
                   defaults={
                       'language': settings.LANGUAGE_CODE,
                       'status': Job.STATUS_OK,
                   })

        # ---------------------------
        if not already_populated:
            get_ct = ContentType.objects.get_for_model
            create_cbci = CustomBrickConfigItem.objects.create
            build_cell = EntityCellRegularField.build

            cbci_email = create_cbci(
                id='emails-entityemail_info',
                name=_(u'Email information'),
                content_type=get_ct(EntityEmail),
                cells=[
                    build_cell(EntityEmail, 'user'),
                    build_cell(EntityEmail, 'reads'),
                    build_cell(EntityEmail, 'status'),
                    build_cell(EntityEmail, 'sender'),
                    build_cell(EntityEmail, 'recipient'),
                    build_cell(EntityEmail, 'subject'),
                    build_cell(EntityEmail, 'reception_date'),
                    build_cell(EntityEmail, 'attachments'),
                    build_cell(EntityEmail, 'body'),
                ],
            )
            cbci_template = create_cbci(
                id='emails-emailtemplate_info',
                name=_(u'Email template information'),
                content_type=get_ct(EmailTemplate),
                cells=[
                    build_cell(EmailTemplate, 'created'),
                    build_cell(EmailTemplate, 'modified'),
                    build_cell(EmailTemplate, 'user'),
                    build_cell(EmailTemplate, 'name'),
                    build_cell(EmailTemplate, 'subject'),
                    build_cell(EmailTemplate, 'body'),
                    build_cell(EmailTemplate, 'signature'),
                ],
            )

            create_bdl = BrickDetailviewLocation.create_if_needed
            TOP = BrickDetailviewLocation.TOP
            LEFT = BrickDetailviewLocation.LEFT
            RIGHT = BrickDetailviewLocation.RIGHT

            create_bdl(brick_id=cbci_email.generate_id(),
                       order=5,
                       zone=LEFT,
                       model=EntityEmail)
            create_bdl(brick_id=bricks.EmailHTMLBodyBrick.id_,
                       order=20,
                       zone=LEFT,
                       model=EntityEmail)
            create_bdl(brick_id=core_bricks.CustomFieldsBrick.id_,
                       order=40,
                       zone=LEFT,
                       model=EntityEmail)
            create_bdl(brick_id=core_bricks.PropertiesBrick.id_,
                       order=450,
                       zone=LEFT,
                       model=EntityEmail)
            create_bdl(brick_id=core_bricks.RelationsBrick.id_,
                       order=500,
                       zone=LEFT,
                       model=EntityEmail)
            create_bdl(brick_id=core_bricks.HistoryBrick.id_,
                       order=20,
                       zone=RIGHT,
                       model=EntityEmail)

            BrickDetailviewLocation.create_4_model_brick(order=5,
                                                         zone=LEFT,
                                                         model=MailingList)
            create_bdl(brick_id=core_bricks.CustomFieldsBrick.id_,
                       order=40,
                       zone=LEFT,
                       model=MailingList)
            create_bdl(brick_id=bricks.EmailRecipientsBrick.id_,
                       order=80,
                       zone=LEFT,
                       model=MailingList)
            create_bdl(brick_id=bricks.ContactsBrick.id_,
                       order=90,
                       zone=LEFT,
                       model=MailingList)
            create_bdl(brick_id=bricks.OrganisationsBrick.id_,
                       order=95,
                       zone=LEFT,
                       model=MailingList)
            create_bdl(brick_id=bricks.ChildListsBrick.id_,
                       order=100,
                       zone=LEFT,
                       model=MailingList)
            create_bdl(brick_id=bricks.ParentListsBrick.id_,
                       order=105,
                       zone=LEFT,
                       model=MailingList)
            create_bdl(brick_id=core_bricks.PropertiesBrick.id_,
                       order=450,
                       zone=LEFT,
                       model=MailingList)
            create_bdl(brick_id=core_bricks.RelationsBrick.id_,
                       order=500,
                       zone=LEFT,
                       model=MailingList)
            create_bdl(brick_id=core_bricks.HistoryBrick.id_,
                       order=20,
                       zone=RIGHT,
                       model=MailingList)

            create_bdl(brick_id=bricks.SendingsBrick.id_,
                       order=2,
                       zone=TOP,
                       model=EmailCampaign)
            BrickDetailviewLocation.create_4_model_brick(order=5,
                                                         zone=LEFT,
                                                         model=EmailCampaign)
            create_bdl(brick_id=core_bricks.CustomFieldsBrick.id_,
                       order=40,
                       zone=LEFT,
                       model=EmailCampaign)
            create_bdl(brick_id=bricks.MailingListsBrick.id_,
                       order=120,
                       zone=LEFT,
                       model=EmailCampaign)
            create_bdl(brick_id=core_bricks.PropertiesBrick.id_,
                       order=450,
                       zone=LEFT,
                       model=EmailCampaign)
            create_bdl(brick_id=core_bricks.RelationsBrick.id_,
                       order=500,
                       zone=LEFT,
                       model=EmailCampaign)
            create_bdl(brick_id=core_bricks.HistoryBrick.id_,
                       order=20,
                       zone=RIGHT,
                       model=EmailCampaign)

            create_bdl(brick_id=cbci_template.generate_id(),
                       order=5,
                       zone=LEFT,
                       model=EmailTemplate)
            create_bdl(brick_id=core_bricks.CustomFieldsBrick.id_,
                       order=40,
                       zone=LEFT,
                       model=EmailTemplate)
            create_bdl(brick_id=bricks.AttachmentsBrick.id_,
                       order=60,
                       zone=LEFT,
                       model=EmailTemplate)
            create_bdl(brick_id=bricks.TemplateHTMLBodyBrick.id_,
                       order=70,
                       zone=LEFT,
                       model=EmailTemplate)
            create_bdl(brick_id=core_bricks.PropertiesBrick.id_,
                       order=450,
                       zone=LEFT,
                       model=EmailTemplate)
            create_bdl(brick_id=core_bricks.RelationsBrick.id_,
                       order=500,
                       zone=LEFT,
                       model=EmailTemplate)
            create_bdl(brick_id=core_bricks.HistoryBrick.id_,
                       order=20,
                       zone=RIGHT,
                       model=EmailTemplate)

            # 'persons' app
            create_bdl(brick_id=bricks.MailsHistoryBrick.id_,
                       order=600,
                       zone=RIGHT,
                       model=Contact)
            create_bdl(brick_id=bricks.MailsHistoryBrick.id_,
                       order=600,
                       zone=RIGHT,
                       model=Organisation)

            # BlockPortalLocation.create_or_update(app_name='emails', brick_id=bricks.SignaturesBrick.id_, order=10)
            # BlockPortalLocation.create_or_update(app_name='emails', brick_id=core_bricks.HistoryBrick.id_, order=30)

            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 (MailingList, EmailCampaign, EmailTemplate):
                    create_bdl(brick_id=a_bricks.TodosBrick.id_,
                               order=100,
                               zone=RIGHT,
                               model=model)
                    create_bdl(brick_id=a_bricks.MemosBrick.id_,
                               order=200,
                               zone=RIGHT,
                               model=model)
                    create_bdl(brick_id=a_bricks.AlertsBrick.id_,
                               order=300,
                               zone=RIGHT,
                               model=model)
                    create_bdl(brick_id=a_bricks.UserMessagesBrick.id_,
                               order=400,
                               zone=RIGHT,
                               model=model)

                # BlockPortalLocation.create_or_update(app_name='emails', brick_id=a_bricks.MemosBrick.id_,        order=100)
                # BlockPortalLocation.create_or_update(app_name='emails', brick_id=a_bricks.AlertsBrick.id_,       order=200)
                # BlockPortalLocation.create_or_update(app_name='emails', brick_id=a_bricks.UserMessagesBrick.id_, order=300)

            if apps.is_installed('creme.documents'):
                # logger.info("Documents app is installed => we use the documents block on EmailCampaign's detail view")

                from creme.documents.bricks import LinkedDocsBrick

                create_bdl(brick_id=LinkedDocsBrick.id_,
                           order=600,
                           zone=RIGHT,
                           model=EmailCampaign)

            # ---------------------------
            ButtonMenuItem.create_if_needed(
                pk='emails-entity_email_link_button',
                model=EntityEmail,
                button=buttons.EntityEmailLinkButton,
                order=20)
Esempio n. 17
0
    def test_relations_brick03(self):
        """With A SpecificRelationBrick ; the concerned relationship is minimal_display=True,
        so the RelationType is excluded.
        """
        user = self.login()
        rbrick_id = RelationsBrick.id_

        rtype1 = RelationType.create(
            ('test-subject_son', 'is the son of'),
            ('test-object_father', 'is the father of'),
            minimal_display=(True, True),
        )[0]
        rtype2 = RelationType.create(
            ('test-subject_brother', 'is the brother of'),
            ('test-object_sister', 'is the sister of'))[0]
        rbi = RelationBrickItem.create(rtype1.id)

        BrickDetailviewLocation.create_4_model_brick(
            order=1, zone=BrickDetailviewLocation.LEFT, model=FakeContact)

        create_bdl = partial(BrickDetailviewLocation.create_if_needed,
                             zone=BrickDetailviewLocation.RIGHT,
                             model=FakeContact)
        create_bdl(brick_id=rbi.brick_id, order=2)
        create_bdl(brick_id=rbrick_id, order=3)

        create_contact = partial(FakeContact.objects.create, user=user)
        atom = create_contact(first_name='Atom', last_name='Tenma')
        tenma = create_contact(first_name='Dr', last_name='Tenma')
        uran = create_contact(first_name='Uran', last_name='Ochanomizu')

        create_rel = partial(Relation.objects.create,
                             subject_entity=atom,
                             user=user)
        create_rel(type=rtype1, object_entity=tenma)
        create_rel(type=rtype2, object_entity=uran)

        response = self.assertGET200(atom.get_absolute_url())
        self.assertTemplateUsed(response, 'creme_core/bricks/relations.html')
        self.assertTemplateUsed(response,
                                'creme_core/bricks/specific-relations.html')

        document = self.get_html_tree(response.content)

        rel_brick_node = self.get_brick_node(document, rbrick_id)
        self.assertInstanceLink(rel_brick_node, uran)
        self.assertNoInstanceLink(rel_brick_node, tenma)

        reloading_info = {'exclude': [rtype1.id]}
        self.assertEqual(
            json_dump(reloading_info, separators=(',', ':')),
            rel_brick_node.attrib.get('data-brick-reloading-info'))

        # Reloading
        response = self.assertGET200(
            reverse('creme_core__reload_detailview_bricks', args=(atom.id, )),
            data={
                'brick_id': rbrick_id,
                'extra_data': json_dump({rbrick_id: reloading_info}),
            },
        )

        # load_data = load_json(response.content)
        load_data = response.json()
        self.assertEqual(load_data[0][0], rbrick_id)

        l_document = self.get_html_tree(load_data[0][1])
        l_rel_brick_node = self.get_brick_node(l_document, rbrick_id)
        self.assertNoInstanceLink(l_rel_brick_node, tenma)
        self.assertInstanceLink(l_rel_brick_node, uran)

        # Reloading + bad data
        def assertBadData(data):
            self.assertGET200(
                reverse('creme_core__reload_detailview_bricks',
                        args=(atom.id, )),
                data={
                    'brick_id': rbrick_id,
                    'extra_data': json_dump({rbrick_id: data}),
                },
            )

        assertBadData(1)
        assertBadData({'include': 1})
        assertBadData({'exclude': 1})
        assertBadData({'include': [[]]})
        assertBadData({'exclude': [[]]})
Esempio n. 18
0
    def populate(self):
        Graph = get_graph_model()

        HeaderFilter.create(
            pk=DEFAULT_HFILTER_GRAPH,
            name=_(u'Graph view'),
            model=Graph,
            cells_desc=[(EntityCellRegularField, {
                'name': 'name'
            })],
        )

        SearchConfigItem.create_if_needed(Graph, ['name'])

        if not BrickDetailviewLocation.config_exists(
                Graph
        ):  # NB: no straightforward way to test that this populate script has not been already run
            create_bdl = BrickDetailviewLocation.create_if_needed
            LEFT = BrickDetailviewLocation.LEFT
            RIGHT = BrickDetailviewLocation.RIGHT

            BrickDetailviewLocation.create_4_model_brick(order=5,
                                                         zone=LEFT,
                                                         model=Graph)
            create_bdl(brick_id=core_bricks.CustomFieldsBrick.id_,
                       order=40,
                       zone=LEFT,
                       model=Graph)
            create_bdl(brick_id=bricks.RootNodesBrick.id_,
                       order=60,
                       zone=LEFT,
                       model=Graph)
            create_bdl(brick_id=bricks.OrbitalRelationTypesBrick.id_,
                       order=65,
                       zone=LEFT,
                       model=Graph)
            create_bdl(brick_id=core_bricks.PropertiesBrick.id_,
                       order=450,
                       zone=LEFT,
                       model=Graph)
            create_bdl(brick_id=core_bricks.RelationsBrick.id_,
                       order=500,
                       zone=LEFT,
                       model=Graph)
            create_bdl(brick_id=core_bricks.HistoryBrick.id_,
                       order=20,
                       zone=RIGHT,
                       model=Graph)

            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=Graph)
                create_bdl(brick_id=a_bricks.MemosBrick.id_,
                           order=200,
                           zone=RIGHT,
                           model=Graph)
                create_bdl(brick_id=a_bricks.AlertsBrick.id_,
                           order=300,
                           zone=RIGHT,
                           model=Graph)
                create_bdl(brick_id=a_bricks.UserMessagesBrick.id_,
                           order=400,
                           zone=RIGHT,
                           model=Graph)

            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=Graph)
Esempio n. 19
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)
Esempio n. 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) is to 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],
                    ),
                ],
            )

        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)),
            ],
        )

        # ---------------------------
        SearchConfigItem.create_if_needed(
            Activity, ['title', 'description', 'type__name'])

        # ---------------------------
        for user in get_user_model().objects.all():
            Calendar.get_user_default_calendar(user)

        # ---------------------------
        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.create_4_model_brick(
                order=5, zone=BrickDetailviewLocation.LEFT, model=Activity)

            create_bdl = BrickDetailviewLocation.create_if_needed
            create_bdl(brick_id=core_bricks.CustomFieldsBrick.id_,
                       order=40,
                       zone=LEFT,
                       model=Activity)
            create_bdl(brick_id=bricks.RelatedCalendarBrick.id_,
                       order=90,
                       zone=LEFT,
                       model=Activity)
            create_bdl(brick_id=bricks.ParticipantsBrick.id_,
                       order=100,
                       zone=LEFT,
                       model=Activity)
            create_bdl(brick_id=bricks.SubjectsBrick.id_,
                       order=120,
                       zone=LEFT,
                       model=Activity)
            create_bdl(brick_id=core_bricks.PropertiesBrick.id_,
                       order=450,
                       zone=LEFT,
                       model=Activity)
            create_bdl(brick_id=core_bricks.RelationsBrick.id_,
                       order=500,
                       zone=LEFT,
                       model=Activity)
            create_bdl(brick_id=core_bricks.HistoryBrick.id_,
                       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_id=a_bricks.TodosBrick.id_,
                           order=100,
                           zone=RIGHT,
                           model=Activity)
                create_bdl(brick_id=a_bricks.MemosBrick.id_,
                           order=200,
                           zone=RIGHT,
                           model=Activity)
                create_bdl(brick_id=a_bricks.AlertsBrick.id_,
                           order=300,
                           zone=RIGHT,
                           model=Activity)
                create_bdl(brick_id=a_bricks.UserMessagesBrick.id_,
                           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_id=LinkedDocsBrick.id_,
                           order=600,
                           zone=RIGHT,
                           model=Activity)

            future_id = bricks.FutureActivitiesBrick.id_
            past_id = bricks.PastActivitiesBrick.id_
            create_bdl(brick_id=future_id, order=20, zone=RIGHT, model=Contact)
            create_bdl(brick_id=past_id, order=21, zone=RIGHT, model=Contact)
            create_bdl(brick_id=future_id,
                       order=20,
                       zone=RIGHT,
                       model=Organisation)
            create_bdl(brick_id=past_id,
                       order=21,
                       zone=RIGHT,
                       model=Organisation)

            # BlockPortalLocation.create_or_update(app_name='persons',    brick_id=future_id, order=20)
            # BlockPortalLocation.create_or_update(app_name='persons',    brick_id=past_id,   order=21)

            # BlockPortalLocation.create_or_update(app_name='creme_core', brick_id=future_id, order=20)
            # BlockPortalLocation.create_or_update(app_name='creme_core', brick_id=past_id,   order=21)
            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)