class History(CremeModel): entity = ForeignKey(CremeEntity, verbose_name=_('Entity'), blank=False, null=False, on_delete=CASCADE) created = fields.CreationDateTimeField(_('Creation date')) action = CharField(_('Action'), max_length=100) # Action (i.e: create, update...) source = CharField( _('Source'), max_length=100 ) # Source (i.e: email raw, email from infopath, sms raw...) description = TextField(_('Description'), blank=True, null=True) user = fields.CremeUserForeignKey( verbose_name=_('Owner'), blank=True, null=True, default=None) # Case of sandboxes are by user class Meta: app_label = 'crudity' verbose_name = _('History') verbose_name_plural = _('History') def get_entity(self): entity = self.entity if entity: entity = entity.get_real_entity() return entity def __str__(self): e = self.get_entity() return 'History of "{}"'.format(e) if e else 'History'
class Memo(creme_models.CremeModel): content = models.TextField(_('Content')) on_homepage = models.BooleanField(_('Displayed on homepage'), blank=True, default=False) creation_date = creme_fields.CreationDateTimeField(_('Creation date'), editable=False) user = creme_fields.CremeUserForeignKey(verbose_name=_('Owner user')) entity_content_type = creme_fields.EntityCTypeForeignKey(related_name='+', editable=False) entity = models.ForeignKey( creme_models.CremeEntity, related_name='assistants_memos', editable=False, on_delete=models.CASCADE, ).set_tags(viewable=False) creme_entity = creme_fields.RealEntityForeignKey( ct_field='entity_content_type', fk_field='entity', ) objects = MemoManager() creation_label = _('Create a memo') save_label = _('Save the memo') class Meta: app_label = 'assistants' verbose_name = _('Memo') verbose_name_plural = _('Memos') def __str__(self): # NB: translate for unicode can not take 2 arguments... return ellipsis(self.content.strip().replace('\n', ''), 25) def get_edit_absolute_url(self): return reverse('assistants__edit_memo', args=(self.id,)) def get_related_entity(self): # For generic views return self.creme_entity
class CommercialApproach(creme_models.CremeModel): title = models.CharField(_('Title'), max_length=200) # ok_or_in_futur = models.BooleanField(_('Done?'), editable=False, default=False) description = models.TextField(_('Description'), blank=True) creation_date = creme_fields.CreationDateTimeField(_('Creation date'), editable=False) related_activity = models.ForeignKey( settings.ACTIVITIES_ACTIVITY_MODEL, null=True, editable=False, on_delete=models.CASCADE, ) # entity_content_type = models.ForeignKey(ContentType, related_name="comapp_entity_set", editable=False, on_delete=models.CASCADE) # entity_id = models.PositiveIntegerField(editable=False) # .set_tags(viewable=False) uncomment if it becomes an auxiliary (get_related_entity()) # creme_entity = GenericForeignKey(ct_field="entity_content_type", fk_field="entity_id") entity_content_type = creme_fields.EntityCTypeForeignKey(related_name='+', editable=False) entity = models.ForeignKey( creme_models.CremeEntity, related_name='commercial_approaches', editable=False, on_delete=models.CASCADE, ) # .set_tags(viewable=False) uncomment if it becomes an auxiliary (get_related_entity()) creme_entity = creme_fields.RealEntityForeignKey( ct_field='entity_content_type', fk_field='entity') creation_label = _('Create a commercial approach') save_label = _('Save the commercial approach') class Meta: app_label = 'commercial' verbose_name = _('Commercial approach') verbose_name_plural = _('Commercial approaches') def __str__(self): return self.title @staticmethod def get_approaches(entity_pk=None): # queryset = CommercialApproach.objects.filter(ok_or_in_futur=False) \ # .select_related('related_activity') queryset = CommercialApproach.objects.select_related( 'related_activity') return queryset.filter(entity_id=entity_pk) if entity_pk else \ queryset.exclude(entity__is_deleted=True) @staticmethod def get_approaches_for_ctypes(ct_ids): warnings.warn( 'CommercialApproach.get_approaches_for_ctypes() is deprecated.', DeprecationWarning) # return CommercialApproach.objects.filter(entity_content_type__in=ct_ids, ok_or_in_futur=False) \ return CommercialApproach.objects.filter(entity_content_type__in=ct_ids) \ .select_related('related_activity')
class Action(creme_models.CremeModel): title = models.CharField(_('Title'), max_length=200) is_ok = models.BooleanField( _('Expected reaction has been done'), editable=False, default=False, ) description = models.TextField(_('Source action'), blank=True) creation_date = creme_fields.CreationDateTimeField(_('Creation date'), editable=False) expected_reaction = models.TextField(_('Target action'), blank=True) deadline = models.DateTimeField(_('Deadline')) validation_date = models.DateTimeField( _('Validation date'), blank=True, null=True, editable=False, ) user = creme_fields.CremeUserForeignKey(verbose_name=_('Owner user')) entity_content_type = creme_fields.EntityCTypeForeignKey(related_name='+', editable=False) entity = models.ForeignKey( creme_models.CremeEntity, related_name='assistants_actions', editable=False, on_delete=models.CASCADE, ).set_tags(viewable=False) creme_entity = creme_fields.RealEntityForeignKey( ct_field='entity_content_type', fk_field='entity', ) objects = ActionManager() creation_label = _('Create an action') save_label = _('Save the action') class Meta: app_label = 'assistants' verbose_name = _('Action') verbose_name_plural = _('Actions') def __str__(self): return self.title def get_edit_absolute_url(self): return reverse('assistants__edit_action', args=(self.id, )) def get_related_entity(self): # For generic views return self.creme_entity
class Memo(creme_models.CremeModel): content = models.TextField(_('Content')) on_homepage = models.BooleanField(_('Displayed on homepage'), blank=True, default=False) creation_date = creme_fields.CreationDateTimeField(_('Creation date'), editable=False) user = creme_fields.CremeUserForeignKey(verbose_name=_('Owner user')) entity_content_type = creme_fields.EntityCTypeForeignKey(related_name='+', editable=False) entity = models.ForeignKey(creme_models.CremeEntity, related_name='assistants_memos', editable=False, on_delete=models.CASCADE, ).set_tags(viewable=False) creme_entity = creme_fields.RealEntityForeignKey(ct_field='entity_content_type', fk_field='entity') objects = MemoManager() creation_label = _('Create a memo') save_label = _('Save the memo') class Meta: app_label = 'assistants' verbose_name = _('Memo') verbose_name_plural = _('Memos') def __str__(self): # NB: translate for unicode can not take 2 arguments... return ellipsis(self.content.strip().replace('\n', ''), 25) def get_edit_absolute_url(self): return reverse('assistants__edit_memo', args=(self.id,)) # @staticmethod # def get_memos(entity): # warnings.warn('Memo.get_memos() is deprecated.', DeprecationWarning) # return Memo.objects.filter(entity_id=entity.id).select_related('user') # @staticmethod # def get_memos_for_home(user): # warnings.warn('Memo.get_memos_for_home() is deprecated.', DeprecationWarning) # return Memo.objects.filter(on_homepage=True, # user__in=[user] + user.teams, # ) \ # .select_related('user') # @staticmethod # def get_memos_for_ctypes(ct_ids, user): # warnings.warn('Memo.get_memos_for_ctypes() is deprecated.', DeprecationWarning) # return Memo.objects.filter(entity_content_type__in=ct_ids, user__in=[user] + user.teams) \ # .select_related('user') def get_related_entity(self): # For generic views return self.creme_entity
class ToDo(CremeModel): title = models.CharField(_('Title'), max_length=200) is_ok = models.BooleanField(_('Done?'), editable=False, default=False) # Needed by creme_core.core.reminder reminded = models.BooleanField(_('Notification sent'), editable=False, default=False) description = models.TextField(_('Description'), blank=True) creation_date = creme_fields.CreationDateTimeField(_('Creation date'), editable=False) deadline = models.DateTimeField(_('Deadline'), blank=True, null=True) user = creme_fields.CremeUserForeignKey(verbose_name=_('Owner user')) entity_content_type = creme_fields.EntityCTypeForeignKey(related_name='+', editable=False) entity = models.ForeignKey( CremeEntity, related_name='assistants_todos', editable=False, on_delete=models.CASCADE, ).set_tags(viewable=False) creme_entity = creme_fields.RealEntityForeignKey( ct_field='entity_content_type', fk_field='entity', ) objects = ToDoManager() creation_label = _('Create a todo') save_label = _('Save the todo') class Meta: app_label = 'assistants' verbose_name = _('Todo') verbose_name_plural = _('Todos') def __str__(self): return self.title def get_edit_absolute_url(self): return reverse('assistants__edit_todo', args=(self.id,)) def get_related_entity(self): # For generic views return self.creme_entity @property def to_be_reminded(self): return self.deadline and not self.is_ok and not self.reminded
class CommercialApproach(creme_models.CremeModel): title = models.CharField(_('Title'), max_length=200) description = models.TextField(_('Description'), blank=True) creation_date = creme_fields.CreationDateTimeField(_('Creation date'), editable=False) related_activity = models.ForeignKey( settings.ACTIVITIES_ACTIVITY_MODEL, null=True, editable=False, on_delete=models.CASCADE, ) entity_content_type = creme_fields.EntityCTypeForeignKey(related_name='+', editable=False) entity = models.ForeignKey( creme_models.CremeEntity, related_name='commercial_approaches', editable=False, on_delete=models.CASCADE, ) # .set_tags(viewable=False) uncomment if it becomes an auxiliary (get_related_entity()) creme_entity = creme_fields.RealEntityForeignKey( ct_field='entity_content_type', fk_field='entity') creation_label = _('Create a commercial approach') save_label = _('Save the commercial approach') class Meta: app_label = 'commercial' verbose_name = _('Commercial approach') verbose_name_plural = _('Commercial approaches') def __str__(self): return self.title @staticmethod def get_approaches(entity_pk=None): queryset = CommercialApproach.objects.select_related( 'related_activity') return queryset.filter(entity_id=entity_pk) if entity_pk else \ queryset.exclude(entity__is_deleted=True)
class Migration(migrations.Migration): # replaces = [ # ('commercial', '0001_initial'), # ('commercial', '0009_v2_0__real_entity_fks_1'), # ('commercial', '0010_v2_0__real_entity_fks_2'), # ('commercial', '0011_v2_0__real_entity_fks_3'), # ('commercial', '0012_v2_0__rm_commapp_ok_or_in_futur'), # ] initial = True dependencies = [ ('contenttypes', '0001_initial'), ('creme_core', '0001_initial'), migrations.swappable_dependency(settings.PERSONS_ORGANISATION_MODEL), migrations.swappable_dependency(settings.ACTIVITIES_ACTIVITY_MODEL), ] operations = [ migrations.CreateModel( name='MarketSegment', fields=[ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('name', models.CharField(max_length=100, verbose_name='Name')), ('property_type', models.ForeignKey(editable=False, to='creme_core.CremePropertyType', null=True, on_delete=CASCADE)), ], options={ 'verbose_name': 'Market segment', 'verbose_name_plural': 'Market segments', }, bases=(models.Model, ), ), migrations.CreateModel( name='ActType', fields=[ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('title', models.CharField(max_length=75, verbose_name='Title')), ('is_custom', models.BooleanField(default=True)), ], options={ 'ordering': ('title', ), 'verbose_name': 'Type of commercial action', 'verbose_name_plural': 'Types of commercial actions', }, bases=(models.Model, ), ), migrations.CreateModel( name='Act', fields=[ ('cremeentity_ptr', models.OneToOneField( parent_link=True, auto_created=True, primary_key=True, serialize=False, to='creme_core.CremeEntity', on_delete=CASCADE, )), ('name', models.CharField( max_length=100, verbose_name='Name of the commercial action')), ('expected_sales', models.PositiveIntegerField(verbose_name='Expected sales')), ('cost', models.PositiveIntegerField( null=True, verbose_name='Cost of the commercial action', blank=True)), ('goal', models.TextField(verbose_name='Goal of the action', blank=True)), ('start', models.DateField(verbose_name='Start')), ('due_date', models.DateField(verbose_name='Due date')), ('segment', models.ForeignKey(on_delete=PROTECT, verbose_name='Related segment', to='commercial.MarketSegment')), ('act_type', models.ForeignKey(on_delete=PROTECT, verbose_name='Type', to='commercial.ActType')), ], options={ 'swappable': 'COMMERCIAL_ACT_MODEL', 'ordering': ('name', ), 'verbose_name': 'Commercial action', 'verbose_name_plural': 'Commercial actions', }, bases=('creme_core.cremeentity', ), ), migrations.CreateModel( name='ActObjective', fields=[ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('name', models.CharField(max_length=100, verbose_name='Name')), ('counter', models.PositiveIntegerField(default=0, verbose_name='Counter', editable=False)), ('counter_goal', models.PositiveIntegerField(default=1, verbose_name='Value to reach')), ('act', models.ForeignKey(related_name='objectives', editable=False, to=settings.COMMERCIAL_ACT_MODEL, on_delete=CASCADE)), ('ctype', creme_fields.CTypeForeignKey( blank=True, editable=False, to='contenttypes.ContentType', null=True, verbose_name='Counted type', )), ('filter', models.ForeignKey( on_delete=PROTECT, blank=True, editable=False, to='creme_core.EntityFilter', null=True, verbose_name='Filter on counted entities', )), ], options={ 'verbose_name': 'Commercial Objective', 'verbose_name_plural': 'Commercial Objectives', }, bases=(models.Model, ), ), migrations.CreateModel( name='ActObjectivePattern', fields=[ ('cremeentity_ptr', models.OneToOneField( parent_link=True, auto_created=True, primary_key=True, serialize=False, to='creme_core.CremeEntity', on_delete=CASCADE, )), ('name', models.CharField(max_length=100, verbose_name='Name')), ('average_sales', models.PositiveIntegerField(verbose_name='Average sales')), ('segment', models.ForeignKey(verbose_name='Related segment', to='commercial.MarketSegment', on_delete=CASCADE)), ], options={ 'swappable': 'COMMERCIAL_PATTERN_MODEL', 'ordering': ('name', ), 'verbose_name': 'Objective pattern', 'verbose_name_plural': 'Objective patterns', }, bases=('creme_core.cremeentity', ), ), migrations.CreateModel( name='ActObjectivePatternComponent', fields=[ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('name', models.CharField(max_length=100, verbose_name='Name')), ('success_rate', models.PositiveIntegerField(verbose_name='Success rate')), ('ctype', creme_fields.CTypeForeignKey(blank=True, editable=False, to='contenttypes.ContentType', null=True, verbose_name='Counted type')), ('filter', models.ForeignKey( on_delete=PROTECT, blank=True, editable=False, to='creme_core.EntityFilter', null=True, verbose_name='Filter on counted entities', )), ('parent', models.ForeignKey( related_name='children', editable=False, to='commercial.ActObjectivePatternComponent', null=True, on_delete=CASCADE, )), ('pattern', models.ForeignKey(related_name='components', editable=False, to=settings.COMMERCIAL_PATTERN_MODEL, on_delete=CASCADE)), ], options={}, bases=(models.Model, ), ), migrations.CreateModel( name='CommercialApproach', fields=[ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('title', models.CharField(max_length=200, verbose_name='Title')), # ('ok_or_in_futur', models.BooleanField(default=False, verbose_name='Done?', editable=False)), ('description', models.TextField(verbose_name='Description', blank=True)), ('creation_date', creme_fields.CreationDateTimeField( default=now, verbose_name='Creation date', editable=False, blank=True)), # ('entity_id', models.PositiveIntegerField(editable=False)), ('entity', models.ForeignKey( editable=False, on_delete=CASCADE, to='creme_core.CremeEntity', related_name='commercial_approaches', )), # ('entity_content_type', models.ForeignKey(related_name='comapp_entity_set', editable=False, to='contenttypes.ContentType', on_delete=CASCADE)), ('entity_content_type', creme_fields.EntityCTypeForeignKey( editable=False, on_delete=CASCADE, related_name='+', to='contenttypes.ContentType', )), ('related_activity', models.ForeignKey(editable=False, to=settings.ACTIVITIES_ACTIVITY_MODEL, null=True, on_delete=CASCADE)), ], options={ 'verbose_name': 'Commercial approach', 'verbose_name_plural': 'Commercial approaches', }, bases=(models.Model, ), ), migrations.CreateModel( name='Strategy', fields=[ ('cremeentity_ptr', models.OneToOneField( parent_link=True, auto_created=True, primary_key=True, serialize=False, to='creme_core.CremeEntity', on_delete=CASCADE, )), ('name', models.CharField(max_length=100, verbose_name='Name')), ('evaluated_orgas', models.ManyToManyField( verbose_name='Evaluated organisation(s)', editable=False, to=settings.PERSONS_ORGANISATION_MODEL, )), ], options={ 'swappable': 'COMMERCIAL_STRATEGY_MODEL', 'ordering': ('name', ), 'verbose_name': 'Commercial strategy', 'verbose_name_plural': 'Commercial strategies', }, bases=('creme_core.cremeentity', ), ), migrations.CreateModel( name='MarketSegmentDescription', fields=[ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('product', models.TextField(verbose_name='Product', blank=True)), ('place', models.TextField(verbose_name='Place', blank=True)), ('price', models.TextField(verbose_name='Price', blank=True)), ('promotion', models.TextField(verbose_name='Promotion', blank=True)), ('segment', models.ForeignKey(to='commercial.MarketSegment', on_delete=CASCADE)), ('strategy', models.ForeignKey( related_name='segment_info', editable=False, to=settings.COMMERCIAL_STRATEGY_MODEL, on_delete=CASCADE, )), ], options={ 'verbose_name': 'Market segment description', 'verbose_name_plural': 'Market segment descriptions', }, bases=(models.Model, ), ), migrations.CreateModel( name='CommercialAsset', fields=[ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('name', models.CharField(max_length=100, verbose_name='Name')), ('strategy', models.ForeignKey(related_name='assets', editable=False, to=settings.COMMERCIAL_STRATEGY_MODEL, on_delete=CASCADE)), ], options={ 'verbose_name': 'Commercial asset', 'verbose_name_plural': 'Commercial assets', }, bases=(models.Model, ), ), migrations.CreateModel( name='CommercialAssetScore', fields=[ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('score', models.PositiveSmallIntegerField()), ('asset', models.ForeignKey(to='commercial.CommercialAsset', on_delete=CASCADE)), ('organisation', models.ForeignKey(to=settings.PERSONS_ORGANISATION_MODEL, on_delete=CASCADE)), ('segment_desc', models.ForeignKey(to='commercial.MarketSegmentDescription', on_delete=CASCADE)), ], options={}, bases=(models.Model, ), ), migrations.CreateModel( name='MarketSegmentCategory', fields=[ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('category', models.PositiveSmallIntegerField()), ('organisation', models.ForeignKey(to=settings.PERSONS_ORGANISATION_MODEL, on_delete=CASCADE)), ('strategy', models.ForeignKey(to=settings.COMMERCIAL_STRATEGY_MODEL, on_delete=CASCADE)), ('segment_desc', models.ForeignKey(to='commercial.MarketSegmentDescription', on_delete=CASCADE)), ], options={}, bases=(models.Model, ), ), migrations.CreateModel( name='MarketSegmentCharm', fields=[ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('name', models.CharField(max_length=100, verbose_name='Name')), ('strategy', models.ForeignKey(related_name='charms', editable=False, to=settings.COMMERCIAL_STRATEGY_MODEL, on_delete=CASCADE)), ], options={ 'verbose_name': 'Segment charm', 'verbose_name_plural': 'Segment charms', }, bases=(models.Model, ), ), migrations.CreateModel( name='MarketSegmentCharmScore', fields=[ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('score', models.PositiveSmallIntegerField()), ('charm', models.ForeignKey(to='commercial.MarketSegmentCharm', on_delete=CASCADE)), ('organisation', models.ForeignKey(to=settings.PERSONS_ORGANISATION_MODEL, on_delete=CASCADE)), ('segment_desc', models.ForeignKey(to='commercial.MarketSegmentDescription', on_delete=CASCADE)), ], options={}, bases=(models.Model, ), ), ]
class Migration(migrations.Migration): # replaces = [ # ('crudity', '0001_initial'), # ('crudity', '0003_v1_7__sync_job_user'), # ] initial = True dependencies = [ migrations.swappable_dependency(settings.AUTH_USER_MODEL), ('contenttypes', '0001_initial'), ('auth', '0001_initial'), ('creme_core', '0001_initial'), ] operations = [ migrations.CreateModel( name='History', fields=[ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('created', creme_fields.CreationDateTimeField( default=now, verbose_name='Creation date', editable=False, blank=True)), ('action', models.CharField(max_length=100, verbose_name='Action')), ('source', models.CharField(max_length=100, verbose_name='Source')), ('description', models.TextField(null=True, verbose_name='Description', blank=True)), ('entity', models.ForeignKey(verbose_name='Entity', to='creme_core.CremeEntity', on_delete=CASCADE)), ('user', creme_fields.CremeUserForeignKey(default=None, blank=True, to=settings.AUTH_USER_MODEL, null=True, verbose_name='Owner')), ], options={ 'verbose_name': 'History', 'verbose_name_plural': 'History', }, bases=(models.Model, ), ), migrations.CreateModel( name='WaitingAction', fields=[ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('action', models.CharField(max_length=100, verbose_name='Action')), ('source', models.CharField(max_length=100, verbose_name='Source')), ('data', models.TextField(null=True, blank=True)), ('subject', models.CharField(max_length=100, verbose_name='Subject')), ('ct', creme_fields.CTypeForeignKey(verbose_name="Ressource's type", to='contenttypes.ContentType')), ('user', creme_fields.CremeUserForeignKey(default=None, blank=True, to=settings.AUTH_USER_MODEL, null=True, verbose_name='Owner')), ], options={ 'verbose_name': 'Waiting action', 'verbose_name_plural': 'Waiting actions', }, bases=(models.Model, ), ), ]
class Migration(migrations.Migration): # replaces = [ # ('assistants', '0001_initial'), # ('assistants', '0006_v2_0__real_entity_fks_1'), # ('assistants', '0007_v2_0__real_entity_fks_2'), # ('assistants', '0008_v2_0__real_entity_fks_3'), # ] initial = True dependencies = [ migrations.swappable_dependency(settings.AUTH_USER_MODEL), ('auth', '0001_initial'), ('contenttypes', '0001_initial'), ] operations = [ migrations.CreateModel( name='Action', fields=[ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('title', models.CharField(max_length=200, verbose_name='Title')), ('is_ok', models.BooleanField( default=False, verbose_name='Expected reaction has been done', editable=False)), ('description', models.TextField(verbose_name='Source action', blank=True)), ('creation_date', creme_fields.CreationDateTimeField( default=now, verbose_name='Creation date', editable=False, blank=True)), ('expected_reaction', models.TextField(verbose_name='Target action', blank=True)), ('deadline', models.DateTimeField(verbose_name='Deadline')), ('validation_date', models.DateTimeField(verbose_name='Validation date', null=True, editable=False, blank=True)), # ('entity_id', models.PositiveIntegerField(editable=False)), ('entity', models.ForeignKey( editable=False, on_delete=CASCADE, to='creme_core.CremeEntity', related_name='assistants_actions', )), # ('entity_content_type', models.ForeignKey(related_name='action_entity_set', editable=False, to='contenttypes.ContentType', on_delete=CASCADE)), ('entity_content_type', creme_fields.EntityCTypeForeignKey( editable=False, on_delete=CASCADE, related_name='+', to='contenttypes.ContentType', )), ('user', creme_fields.CremeUserForeignKey( verbose_name='Owner user', to=settings.AUTH_USER_MODEL)), ], options={ 'verbose_name': 'Action', 'verbose_name_plural': 'Actions', }, bases=(models.Model, ), ), migrations.CreateModel( name='Alert', fields=[ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('title', models.CharField(max_length=200, verbose_name='Title')), ('description', models.TextField(verbose_name='Description', blank=True)), ('is_validated', models.BooleanField(default=False, verbose_name='Validated', editable=False)), ('reminded', models.BooleanField(default=False, editable=False, verbose_name='Notification sent')), ('trigger_date', models.DateTimeField(verbose_name='Trigger date')), # ('entity_id', models.PositiveIntegerField(editable=False)), ('entity', models.ForeignKey( editable=False, on_delete=CASCADE, to='creme_core.CremeEntity', related_name='assistants_alerts', )), # ('entity_content_type', models.ForeignKey(related_name='alert_entity_set', editable=False, to='contenttypes.ContentType', on_delete=CASCADE)), ('entity_content_type', creme_fields.EntityCTypeForeignKey( editable=False, on_delete=CASCADE, related_name='+', to='contenttypes.ContentType', )), ('user', creme_fields.CremeUserForeignKey( verbose_name='Owner user', to=settings.AUTH_USER_MODEL)), ], options={ 'verbose_name': 'Alert', 'verbose_name_plural': 'Alerts', }, bases=(models.Model, ), ), migrations.CreateModel( name='Memo', fields=[ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('content', models.TextField(verbose_name='Content')), ('on_homepage', models.BooleanField(default=False, blank=True, verbose_name='Displayed on homepage')), ('creation_date', creme_fields.CreationDateTimeField( default=now, verbose_name='Creation date', editable=False, blank=True)), # ('entity_id', models.PositiveIntegerField(editable=False)), ('entity', models.ForeignKey( editable=False, on_delete=CASCADE, to='creme_core.CremeEntity', related_name='assistants_memos', )), # ('entity_content_type', models.ForeignKey(related_name='memo_entity_set', editable=False, to='contenttypes.ContentType', on_delete=CASCADE)), ('entity_content_type', creme_fields.EntityCTypeForeignKey( editable=False, on_delete=CASCADE, related_name='+', to='contenttypes.ContentType', )), ('user', creme_fields.CremeUserForeignKey( verbose_name='Owner user', to=settings.AUTH_USER_MODEL)), ], options={ 'verbose_name': 'Memo', 'verbose_name_plural': 'Memos', }, bases=(models.Model, ), ), migrations.CreateModel( name='ToDo', fields=[ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('title', models.CharField(max_length=200, verbose_name='Title')), ('is_ok', models.BooleanField(default=False, verbose_name='Done ?', editable=False)), ('reminded', models.BooleanField(default=False, editable=False, verbose_name='Notification sent')), ('description', models.TextField(verbose_name='Description', blank=True)), ('creation_date', creme_fields.CreationDateTimeField( default=now, verbose_name='Creation date', editable=False, blank=True)), ('deadline', models.DateTimeField(null=True, verbose_name='Deadline', blank=True)), # ('entity_id', models.PositiveIntegerField(editable=False)), ('entity', models.ForeignKey( editable=False, on_delete=CASCADE, to='creme_core.CremeEntity', related_name='assistants_todos', )), # ('entity_content_type', models.ForeignKey(related_name='todo_entity_set', editable=False, to='contenttypes.ContentType', on_delete=CASCADE)), ('entity_content_type', creme_fields.EntityCTypeForeignKey( editable=False, on_delete=CASCADE, related_name='+', to='contenttypes.ContentType', )), ('user', creme_fields.CremeUserForeignKey( verbose_name='Owner user', to=settings.AUTH_USER_MODEL)), ], options={ 'verbose_name': 'Todo', 'verbose_name_plural': 'Todos', }, bases=(models.Model, ), ), migrations.CreateModel( name='UserMessagePriority', fields=[ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('title', models.CharField(max_length=200, verbose_name='Title')), ('is_custom', models.BooleanField(default=True)), ], options={ 'ordering': ('title', ), 'verbose_name': 'Priority of user message', 'verbose_name_plural': 'Priorities of user message', }, bases=(models.Model, ), ), migrations.CreateModel( name='UserMessage', fields=[ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('title', models.CharField(max_length=200, verbose_name='Title')), ('body', models.TextField(verbose_name='Message body')), ('creation_date', models.DateTimeField(verbose_name='Creation date')), ('email_sent', models.BooleanField(default=False)), # ('entity_id', models.PositiveIntegerField(null=True)), ('entity', models.ForeignKey( editable=False, on_delete=CASCADE, to='creme_core.CremeEntity', related_name='assistants_messages', null=True, )), # ('entity_content_type', models.ForeignKey(to='contenttypes.ContentType', null=True, on_delete=CASCADE)), ('entity_content_type', creme_fields.EntityCTypeForeignKey( editable=False, on_delete=CASCADE, related_name='+', to='contenttypes.ContentType', null=True, )), ('priority', models.ForeignKey(on_delete=PROTECT, verbose_name='Priority', to='assistants.UserMessagePriority')), ('recipient', creme_fields.CremeUserForeignKey( to=settings.AUTH_USER_MODEL, verbose_name='Recipient', related_name='received_assistants_messages_set', )), ('sender', creme_fields.CremeUserForeignKey( to=settings.AUTH_USER_MODEL, verbose_name='Sender', related_name='sent_assistants_messages_set', )), ], options={ 'verbose_name': 'User message', 'verbose_name_plural': 'User messages', }, bases=(models.Model, ), ), ]
class ToDo(CremeModel): title = models.CharField(_('Title'), max_length=200) is_ok = models.BooleanField(_('Done ?'), editable=False, default=False) reminded = models.BooleanField( _('Notification sent'), editable=False, default=False) # Needed by creme_core.core.reminder description = models.TextField(_('Description'), blank=True) creation_date = creme_fields.CreationDateTimeField(_('Creation date'), editable=False) deadline = models.DateTimeField(_('Deadline'), blank=True, null=True) user = creme_fields.CremeUserForeignKey(verbose_name=_('Owner user')) entity_content_type = creme_fields.EntityCTypeForeignKey(related_name='+', editable=False) entity = models.ForeignKey( CremeEntity, related_name='assistants_todos', editable=False, on_delete=models.CASCADE, ).set_tags(viewable=False) creme_entity = creme_fields.RealEntityForeignKey( ct_field='entity_content_type', fk_field='entity') objects = ToDoManager() creation_label = _('Create a todo') save_label = _('Save the todo') class Meta: app_label = 'assistants' verbose_name = _('Todo') verbose_name_plural = _('Todos') def __str__(self): return self.title def get_edit_absolute_url(self): return reverse('assistants__edit_todo', args=(self.id, )) # @staticmethod # def get_todos(entity): # warnings.warn('ToDo.get_todos() is deprecated.', DeprecationWarning) # return ToDo.objects.filter(entity_id=entity.id).select_related('user') # @staticmethod # def get_todos_for_home(user): # warnings.warn('ToDo.get_todos_for_home() is deprecated ; ' # 'use ToDo.objects.filter_by_user() instead.', # DeprecationWarning # ) # return ToDo.objects.filter(user__in=[user] + user.teams)\ # .select_related('user') # @staticmethod # def get_todos_for_ctypes(ct_ids, user): # warnings.warn('ToDo.get_todos_for_ctypes() is deprecated.', DeprecationWarning) # return ToDo.objects.filter(entity_content_type__in=ct_ids, # user__in=[user] + user.teams # ).select_related('user') def get_related_entity(self): # For generic views return self.creme_entity @property def to_be_reminded(self): return self.deadline and not self.is_ok and not self.reminded