class PlateImage(models.Model): """ An image plate (image with many moths). Maintains an ImageField, for thumbnails, and non-zoomify support as well as a FilePath for the zoomify folder. """ objects = PlateImageManager() # Admin Help Docs z_image_docs = "Select the ImageProperties.xml file in the corresponding image folder." IMAGE_PATH = "plates/" ZOOM_PATH = "plates_z/" ZOOM_ABS_PATH = "%s%s" % (settings.MEDIA_ROOT, ZOOM_PATH) SIZES = {"thumbnail": "240x300", "medium": "480x600"} description = PlaceholderField('Description') image = ImageField(upload_to=IMAGE_PATH) z_image = models.FilePathField(path=ZOOM_ABS_PATH, recursive=True, match="ImageProperties.xml", max_length=200, help_text=z_image_docs, blank=True, null=True) member_species = models.ManyToManyField(Species) @property def zoomify_folder(self): """ Returns the corresponding zoomify directory with ImageProperties.xml removed. """ return "%s%s" % (ZOOM_PATH, os.path.split(os.path.dirname( self.z_image))[1]) def __unicode__(self): return u"%s" % self.image.name
class Contraparte(models.Model): nombre = models.CharField(max_length=200) siglas = models.CharField( "Siglas o nombre corto", help_text="Siglas o nombre corto de la oganización", max_length=200, blank=True, null=True) logo = ImageField(upload_to=get_file_path, null=True, blank=True) fileDir = 'contrapartes/logos/' pais = models.ForeignKey(Pais, on_delete=models.DO_NOTHING) fundacion = models.CharField('Año de fundación', max_length=200, blank=True, null=True) temas = RichTextUploadingField(blank=True, null=True) generalidades = RichTextUploadingField(blank=True, null=True) contacto = models.CharField(max_length=200, blank=True, null=True) correo = models.EmailField(blank=True, null=True) telefono = models.CharField(max_length=200, blank=True, null=True) #sitio_web = models.URLField(blank=True, null=True) #rss = models.CharField(max_length=200,blank=True, null=True) #font_color = ColorField(blank=True,unique=True) slug = models.SlugField(max_length=200, editable=False) class Meta: verbose_name_plural = "Contrapartes" #unique_together = ("font_color", "nombre") def __str__(self): return self.nombre def get_absolute_url(self): return '/contrapartes/%d/' % (self.id, ) def save(self, *args, **kwargs): self.slug = slugify(self.nombre) return super(Contraparte, self).save(*args, **kwargs)
class Location(models.Model): name = models.CharField(_('name'), max_length=255) slug = models.SlugField(_('slug'), blank=False, null=True, max_length=255) position = GeopositionField(null=True) group = models.ForeignKey('geo.LocationGroup', verbose_name=_('location group'), null=True, blank=True) city = models.CharField(_('city'), blank=True, null=True, max_length=255) country = models.ForeignKey('geo.Country', blank=True, null=True) description = models.TextField(_('description'), blank=True) image = ImageField( _('image'), max_length=255, null=True, blank=True, upload_to='location_images/', help_text=_('Location picture'), validators=[ FileMimetypeValidator( allowed_mimetypes=settings.IMAGE_ALLOWED_MIME_TYPES, ), validate_file_infection ]) class Meta(GeoBaseModel.Meta): ordering = ['name'] verbose_name = _('office location') verbose_name_plural = _('office locations') def save(self, *args, **kwargs): if not self.slug: self.slug = slugify(self.name) super(Location, self).save() def __str__(self): return self.name
class Photo(models.Model): location = models.ForeignKey(Location, on_delete=models.CASCADE) image = ImageField(upload_to=PathAndRename('locations/')) title = models.CharField(max_length=100) taken_date = models.DateField('Taken', blank=True, null=True) credit = models.CharField(max_length=50, blank=True, null=True) source = models.URLField(max_length=200, blank=True, null=True) license = models.CharField(max_length=50, blank=True, null=True) created_at = models.DateTimeField(auto_now_add=True) # # Properties # @property # def caption(self): # return '%s%s [%s%s%s]' % ( # self.title, # ' (%s)' % (self.year) if self.year else '', # self.credit, # ' - %s' % (urlparse(self.source).hostname.replace('www.', '')) if self.source else '', # ' - %s' % (self.license) if self.license else '' # ) def __str__(self): return self.title
class Picture(models.Model): GENDER_CHOICES = [(0, 'male'), (1, 'female')] ETHNICITY_CHOICES = [(0, 'white'), (1, 'asian'), (2, 'black'), (3, 'other')] owner = models.ForeignKey(to=UserProfile) pic = ImageField(upload_to='images/uploaded_images') # Upload Images to a folder named by user_id real_age = models.IntegerField(null=True, blank=True) ground_truth = models.IntegerField(default=0) ### Not used yet gender = models.NullBooleanField(choices=GENDER_CHOICES, null=True, blank=True) ethnic = models.NullBooleanField(choices=ETHNICITY_CHOICES, null=True, blank=True) ### date = models.DateField() visibility = models.BooleanField(default=True) num_votes = models.IntegerField(null=True, blank=True, default=0) cum_votes = models.IntegerField(null=True, blank=True, default=0) hist = models.TextField(null=True, blank=True) def __unicode__(self): return self.pic.name
class Channel(MPTTModel, SimpleContentModel): parent = TreeForeignKey('self', blank=True, null=True, related_name='children', verbose_name=_("Parent")) image = ImageField( blank=True, upload_to="channels", verbose_name=_("Image"), ) alternative_color_hex = RGBColorField( default="#000000", verbose_name=_("Cor Alternativa"), ) tags = TaggableManager(blank=True) class Meta: verbose_name = _(TINYPORTAL_CHANNEL_VERBOSE_NAME) verbose_name_plural = _(TINYPORTAL_CHANNEL_VERBOSE_NAME_PLURAL)
class Product(CommonModel): title = models.CharField(max_length=250, verbose_name=_("Title")) brand = models.CharField(max_length=250, verbose_name=_("Brand")) price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name=_("Price")) image = ImageField( upload_to="favorites/product", verbose_name=_("Image"), help_text=_("Send an image 500x500 pixels or in a proportional size"), ) review_score = models.DecimalField(max_digits=10, decimal_places=4, verbose_name=_("Review Score"), default=0) def __str__(self): return self.title class Meta: ordering = ("title", ) verbose_name = _("Product") verbose_name_plural = _("Product")
class Blog(models.Model): class Meta: verbose_name = 'Blog' verbose_name_plural = 'Blogs' nombre = models.CharField(verbose_name='Nombre', max_length=100, help_text='Nombre del blog') en_nombre = models.CharField(verbose_name='Nombre en Ingles', max_length=100, help_text='Nombre del blog en Ingles') imagen = ImageField(verbose_name='Foto', upload_to='own', help_text='Foto del blog') def __unicode__(self): return self.nombre def save(self, *args, **kwargs): settings.NEED_TO_RECALCULATE = True super(Blog, self).save(*args, **kwargs)
class Color(models.Model): """цвета для масел""" class Meta: verbose_name = "Цвет" verbose_name_plural = "Цвета" ordering = ['color_sort', 'color_title'] def __str__(self): return self.color_title color_title = models.CharField(verbose_name='Подпись', max_length=50) color_image = ImageField(verbose_name='Изображение', upload_to='products/colors', null=True, blank=True) color_html = models.CharField( verbose_name='Цвет HEX', max_length=20, help_text='Цвет в формате HEX, например: "#ebe7e0"', null=True, blank=True) color_sort = models.IntegerField('Сортировка', default=0) color_group = models.ForeignKey(ColorGroup, models.DO_NOTHING)
class Image(models.Model): user = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='images_created') title = models.CharField(max_length=240) image = ImageField(upload_to='images/%Y/%m/%d') created = models.DateTimeField(auto_now_add=True, db_index=True, blank=True) users_like = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name='images_liked', blank=True) users_view = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name='images_viewed', blank=True) def __str__(self): return self.title def get_absolute_url(self): return reverse('images:detail', args=[self.id]) def clear_thumbnails(self): delete_thumbnails(self.image)
class Topic(models.Model): """ Generic Topics for FAQ question grouping """ name = models.CharField(_('name'), max_length=150) description = models.TextField(help_text=_('Description of topic')) slug = models.SlugField(_('slug'), max_length=150) image = ImageField(upload_to='faq-images/topics/', null=True) sort_order = models.IntegerField( _('sort order'), default=0, help_text=_('The order you would like the topic to be displayed.')) def get_absolute_url(self): return '/faq/' + self.slug class Meta: verbose_name = _("Topic") verbose_name_plural = _("Topics") ordering = ['sort_order', 'name'] def __str__(self): return self.name
class Arc(models.Model): name = models.CharField(max_length=200) slug = models.SlugField(max_length=255, unique=True) desc = models.TextField("Description", blank=True) image = ImageField(upload_to="arc/%Y/%m/%d/", blank=True) modified = models.DateTimeField(auto_now=True) created_on = models.DateTimeField(auto_now_add=True) edited_by = models.ForeignKey(CustomUser, default=1, on_delete=models.SET_DEFAULT) @property def issue_count(self): return self.issue_set.all().count() def get_absolute_url(self): return reverse("arc:detail", args=[self.slug]) def __str__(self) -> str: return self.name class Meta: ordering = ["name"]
class EventRevision(models.Model): event = models.ForeignKey(Event) user = models.ForeignKey(User, null=True) title = models.CharField(max_length=200) placeholder_img = ImageField(upload_to=_upload_path('event-placeholder'), blank=True, null=True) picture = models.ForeignKey('Picture', blank=True, null=True) description = models.TextField() short_description = models.TextField( blank=True, help_text='If not provided, this will be filled in by the first ' 'words of the full description.') channels = models.ManyToManyField(Channel) tags = models.ManyToManyField(Tag, blank=True) call_info = models.TextField(blank=True) additional_links = models.TextField(blank=True) recruitmentmessage = models.ForeignKey(RecruitmentMessage, null=True, on_delete=models.SET_NULL) created = models.DateTimeField(default=_get_now) objects = EventRevisionManager()
class Post(models.Model, HitCountMixin): category = models.ForeignKey(Category, on_delete=models.SET_NULL, blank=True, null=True) title = models.CharField(max_length=200, unique=True) slug = models.SlugField(max_length=200, unique=True) author = models.ForeignKey(User, on_delete=models.CASCADE) updated_on = models.DateTimeField(auto_now=True) image = ImageField(upload_to='postimages', blank=True) summary = models.CharField(max_length=400, blank=True) content = models.TextField() created_on = models.DateTimeField(auto_now_add=True) status = models.IntegerField(choices=STATUS, default=0) enable_comments = models.BooleanField(default=True) hitcount = GenericRelation(HitCount, object_id_field='object_pk') carousel = models.BooleanField(default=False) class Meta: ordering = ['-created_on'] def __str__(self): return self.title
class Group(models.Model): """ Groups are the entities to which both Kids and Caretakers belong to. """ title = models.CharField(max_length="60", verbose_name='Groepnaam') groupclass = models.CharField(max_length="120", verbose_name='Klasse', choices=GROUP_CLASSES) groupimage = ImageField(upload_to='kids/groups', help_text='Het beeld voor deze groep', verbose_name='Groepsbeeld', blank=True, null=True) slug = AutoSlugField(populate_from='title', max_length=100, always_update=True) def __unicode__(self): return self.title def get_absolute_url(self): return reverse('GroupView', kwargs={'slug': self.slug})
class Compromiso(models.Model): pais = models.CharField(max_length=3, choices=data.COUNTRIES_CODE_CHOICES, unique=True) conteo_hombres = models.IntegerField() conteo_mujeres = models.IntegerField() total = models.IntegerField(editable=False) foto = ImageField(upload_to='compromisos/', help_text='300x224') class Meta: verbose_name_plural = 'Compromisos' def __str__(self): return self.pais def save(self, *args, **kwargs): self.total = self.conteo_mujeres + self.conteo_hombres return super(Compromiso, self).save(*args, *kwargs) @property def cached_img(self): im = get_thumbnail(self.foto, '300x224', crop='center', quality=99) return im.url
class Contraparte(models.Model): nombre = models.CharField(max_length=200) siglas = models.CharField("Siglas o nombre corto",help_text="Siglas o nombre corto de la oganización",max_length=200) logo = ImageField(upload_to='contrapartes/logos/',null=True, blank=True) pais = models.ForeignKey(Pais,on_delete=models.DO_NOTHING) fundacion = models.CharField('Año de fundación', max_length=200,blank=True, null=True) temas = RichTextUploadingField(blank=True, null=True) generalidades = RichTextUploadingField(blank=True, null=True) contacto = models.CharField(max_length=200,blank=True, null=True) correo = models.EmailField(blank=True, null=True) telefono = models.CharField(max_length=200, blank=True, null=True) # usuarios = models.ManyToManyField(User,blank=True) slug = models.SlugField(max_length=200,editable=False) class Meta: verbose_name_plural = "Alianzas" def __str__(self): return self.nombre def save(self, *args, **kwargs): self.slug = slugify(self.nombre) return super(Contraparte, self).save(*args, **kwargs)
class BaseImage(models.Model): class Meta(object): abstract = True ordering = ('order', 'id') permissions = ( ('moderate_images', 'View, update and delete any image'), ) title = models.CharField(_('Title'), max_length=255, blank=True, null=True) description = models.TextField(_('Description'), blank=True, null=True) tags = TagField(_('Tags'), blank=True) order = models.IntegerField(_('Order'), default=0) image = ImageField(verbose_name=_('File'), max_length=255, upload_to=FilePathGenerator(to=UPLOAD_TO)) user = models.ForeignKey(get_user_model_name(), verbose_name=_('User'), null=True, blank=True, related_name='images') created = models.DateTimeField(_('Created'), auto_now_add=True, null=True) updated = models.DateTimeField(_('Updated'), auto_now=True, null=True) album = models.ForeignKey(swapper.get_model_name('imagestore', 'Album'), verbose_name=_('Album'), null=True, blank=True, related_name='images') @permalink def get_absolute_url(self): return 'imagestore:image', (), {'pk': self.id} def __str__(self): return '%s' % self.id def admin_thumbnail(self): try: return '<img src="%s">' % get_thumbnail(self.image, '100x100', crop='center').url except IOError: logger.exception('IOError for image %s', self.image) return 'IOError' except ThumbnailError as ex: return 'ThumbnailError, %s' % ex.message admin_thumbnail.short_description = _('Thumbnail') admin_thumbnail.allow_tags = True
class Person(TimestampedModel): user = models.OneToOneField(User, blank=True, null=True, related_name="%(app_label)s_%(class)s_profile") name = models.CharField(max_length=1024) slug = AutoSlugField( db_index=True, unique=True, editable=True, populate_from='name', help_text= "Used to make a nice url for the page that displays this person.") photo = ImageField(upload_to=person_photo_upload_to, blank=True, help_text="Photos must be at least 500px by 500px.") twitter_username = models.CharField(max_length=15, blank=True) title = models.CharField(max_length=1024, blank=True) organisation = models.CharField(max_length=1024, blank=True) sort_order = models.IntegerField( default=0, blank=True, help_text="Order in which the person will appear in a list.") class Meta: abstract = True ordering = ['sort_order', 'name'] def __str__(self): return self.name def save(self, *args, **kwargs): """ Overridden save to ensure that twitter_username is stripped of any @. """ self.twitter_username = self.twitter_username.lstrip('@') super(Person, self).save(*args, **kwargs)
class Tour(ParentModel): """ main Tour model """ image = ImageField(_("Image"), upload_to=get_file_name, blank=True, null=True) duration = models.CharField(u"Длительность тура", max_length=100, blank=True, default='') tour_type = models.ForeignKey("TourType", blank=True, null=True, help_text=u'для тематического фильтра - ' u'военный, литература, кино, шведы...') g_ind = models.ForeignKey( "GeoIndicator", help_text=u'Географический признак (город/район)') places = models.ManyToManyField(Place, blank=True, null=True, related_name='tour-place') complect = models.ForeignKey( "Complectation", help_text=u'Тип экскурсии - индивидуальная/сборная') route = models.URLField(u"Маршрут", blank=True, help_text=u'Место для ссылки на карту с маршрутом') # here we need link to rewiews. How? VK and E-Mail... class Meta: verbose_name = u'"Экскурсия"' verbose_name_plural = u'Экскурсии' def get_absolute_path(self): return "/tours/{}".format(self.slug)
class Channel(models.Model): name = models.CharField(max_length=200) slug = models.SlugField(max_length=100, unique=True, db_index=True) image = ImageField(upload_to=_upload_path_channels, blank=True) image_is_banner = models.BooleanField(default=False) parent = models.ForeignKey('self', name='parent', null=True) description = models.TextField() created = models.DateTimeField(default=_get_now) reverse_order = models.BooleanField(default=False) exclude_from_trending = models.BooleanField(default=False) always_show = models.BooleanField(default=False, help_text=""" If always shown, it will appear as a default option visible by default when uploading and entering details. """.strip()) never_show = models.BooleanField(default=False, help_text=""" If never show, it's not an option for new events. Not even available but hidden first. """.strip()) default = models.BooleanField(default=False, help_text=""" If no channel is chosen by the user, this one definitely gets associated with the event. You can have multiple of these. It doesn't matter if the channel is "never_show". """) no_automated_tweets = models.BooleanField(default=False, help_text=""" If an event belongs to a channel with this on, that event will not cause automatic EventTweets to be generated. """) class Meta: ordering = ['name'] def __unicode__(self): return self.name def get_children(self): return Channel.objects.filter(parent=self)
class Article(models.Model, HitCountMixin): """Статья""" STATUS_CHOICES = ( ('draft', 'Черновик'), ('published', 'Опубликовано'), ) slug = models.SlugField(default='', unique=True) title = models.CharField(default='', max_length=70) description = models.TextField('Описание', default='') content = HTMLField('Content') created = models.DateTimeField(auto_now_add=True) published = models.DateField('опубликовано', null=True, blank=True, default=timezone.now) updated = models.DateTimeField(auto_now=True) image = ImageField(upload_to='articles/', blank=True) author = models.ForeignKey(User, verbose_name='Автор', null=True, blank=True, on_delete=CASCADE) status = models.CharField(max_length=12, choices=STATUS_CHOICES, default='published') def __str__(self): return self.title class Meta: ordering = ('-published', ) verbose_name = 'Статьи' verbose_name_plural = 'Статьи' db_table = 'articles' def get_absolute_url(self): return reverse('article', args=[str(self.slug)])
class Person(User): user = models.OneToOneField(User, parent_link=True) avatar = ImageField(upload_to=get_avatars_dir, verbose_name=u'Аватарка', blank=True, null=True) phone = models.CharField(u'Телефон', max_length=80, blank=True, null=True) website = models.CharField(u'Сайт', max_length=80, blank=True, null=True) city = models.CharField(u'Город', max_length=80, blank=True, null=True) about = models.TextField(u'О вас', max_length=80, blank=True, null=True) followers = models.ManyToManyField(User, null=True, blank=True, related_name='person_users_followers', serialize=True) dealer = models.BooleanField(u'Дилер', default=False) objects = UserManager() search = SphinxSearch(weights={'name': 100, 'description': 80}) searchdelta = SphinxQuerySet(index="main_person", mode='SPH_MATCH_EXTENDED2', rankmode='SPH_RANK_NONE') @property def icon(self): try: im = get_thumbnail(self.avatar, '80') return im.url except: return '/static/images/user-unknown.png' @property def icon_small(self): try: im = get_thumbnail(self.avatar, '38') return im.url except: return '/static/images/user-unknown-small.png'
class ExternalFormEntry(models.Model): """ Link redirecting to a form on external site. """ title = models.CharField(_("Title"), max_length=255) slug = models.SlugField(_('Slug'), max_length=255, unique=True) banner = ImageField(_("Banner"), upload_to='form_banners', null=True, blank=True) url = models.CharField(_("Link"), max_length=511) status = models.IntegerField(_("Status"), choices=STATUS_CHOICES, default=STATUS_PUBLISHED) publish_date = models.DateTimeField( _("Published from"), help_text=_("With published selected, won't be shown until this time"), blank=True, null=True) expiry_date = models.DateTimeField( _("Expires on"), help_text=_("With published selected, won't be shown after this time"), blank=True, null=True) forms_list = models.ManyToManyField(FormsList, related_name='external_forms', blank=True) class Meta: verbose_name = _("External form") verbose_name_plural = _("External forms") def __str__(self): return str(self.title) def get_absolute_url(self): return self.url
class OriginalNewsSource(TranslatableModel): name = models.CharField( max_length=200, unique=True, help_text='Short (and commonly used) name', ) slug = models.SlugField( max_length=200, help_text= 'The Slug must be unique, and closely match the title for better SEO; it is used as part of the URL.', ) fullname = models.CharField( max_length=200, blank=True, help_text= 'If set, the full name will be used in some places instead of the name', ) url = models.CharField(max_length=255) logo = ImageField(null=True, blank=True, upload_to='partners') article_count = models.IntegerField( default=0, editable=False, ) def title(self): return self.fullname if self.fullname else self.name def __str__(self): return self.name def get_absolute_url(self): return reverse('partners:detail', kwargs={ 'slug': self.slug, }) class Meta: verbose_name = 'partner'
class SermonSpeaker(models.Model): forename = models.CharField(max_length=100) surname = models.CharField(max_length=100) slug = KanisaAutoSlugField(populate_from=sermon_speaker_slug) image = ImageField(null=True, blank=True, upload_to='kanisa/sermons/speakers/', help_text='Must be at least 400px by 300px.') biography = models.TextField( blank=True, help_text='Give a brief biography of the speaker.') modified = models.DateTimeField(auto_now=True) objects = SpeakerManager() def __unicode__(self): return '%s %s' % (self.forename, self.surname) def name(self): return unicode(self) def image_or_default(self): if self.image: return self.image branding = BrandingInformation('apple') return branding.url class Meta: # Need this because I've split up models.py into multiple # files. app_label = 'kanisa' ordering = ( 'surname', 'forename', ) verbose_name = 'Speaker'
class Announcement(models.Model): objects = AnnouncementManager() created = models.DateTimeField(auto_now_add=True) updated = models.DateTimeField(auto_now=True) title = models.CharField(max_length=255) text = models.TextField(max_length=750) image = ImageField(default='', blank=True, help_text=('60x60 pixel image recommended. Image ' 'will be rescaled automatically to ' 'a square.'), upload_to=_calculate_image_filename) publish_from = models.DateTimeField(help_text='Timezone is %s' % settings.TIME_ZONE) publish_until = models.DateTimeField(blank=True, null=True, help_text='Timezone is %s' % settings.TIME_ZONE) def clean(self): self.text = bleach.clean(self.text, tags=ALLOWED_TAGS, strip=True) if self.publish_until and self.publish_until < self.publish_from: raise ValidationError( 'Publish until must come after publish from.') @property def published(self): now = datetime.now() return ((self.publish_from <= now) and (self.publish_until > now if self.publish_until else True)) def __unicode__(self): return self.title class Meta: ordering = ['-publish_from'] get_latest_by = 'publish_from'
class NewsFlashColumnModuleModel(BaseModel): path = str(datetime.now().year) + '/' + str(datetime.now().month) fullpath = 'images/modules/' + path show_title = models.BooleanField(default=True) show_footer = models.BooleanField(default=True) show_more = models.BooleanField(default=True) show_info = models.BooleanField(default=True) link_title = models.BooleanField(default=True) show_mainimage = models.BooleanField(default=True) exposefirst = models.BooleanField(default=True) columns = models.IntegerField(null=True, blank=True) page_title = models.CharField(max_length=255, verbose_name=u'Tytuł strony', null=True, blank=True) show_page_title = models.BooleanField(default=True) class_prefix = models.CharField(max_length=255, verbose_name=u'prefix stylu', null=True, blank=True) info = RichTextField(config_name='full_ck', verbose_name=u'Krótki opis', null=True, blank=True) image = ImageField(upload_to=fullpath, verbose_name='Zdjęcie', blank=True, null=True) objects = ModelModuleManager() class Meta: db_table = 'module_newsflash_c_option' abstract = True def __unicode__(self): return "%s" % self.__class__
class Article(models.Model): """ An Article within a Message which will be send through a Submission. """ sortorder = models.PositiveIntegerField( help_text=_('Sort order determines the order in which articles are ' 'concatenated in a post.'), verbose_name=_('sort order'), db_index=True, default=get_next_order ) title = models.CharField(max_length=200, verbose_name=_('title')) text = models.TextField(verbose_name=_('text')) url = models.URLField( verbose_name=_('link'), blank=True, null=True ) # Make this a foreign key for added elegance image = ImageField( upload_to='newsletter/images/%Y/%m/%d', blank=True, null=True, verbose_name=_('image') ) # Message this article is associated with # TODO: Refactor post to message (post is legacy notation). post = models.ForeignKey( 'Message', verbose_name=_('message'), related_name='articles' ) class Meta: ordering = ('sortorder',) verbose_name = _('article') verbose_name_plural = _('articles') def __unicode__(self): return self.title
class BotMessage(models.Model): contact = models.ForeignKey(BotContact, on_delete=models.CASCADE, null=True) text = models.TextField(default='', blank=True) image = ImageField(blank=True, null=True) crontab = models.CharField(max_length=255, default='*/*/*/*/*', blank=True, help_text='m/h/dM/MY/dW') def save(self, *args, **kwargs): minute, hour, day_of_month, month_of_year, day_of_week = self.crontab.split( '/') with transaction.atomic(): super(BotMessage, self).save(*args, **kwargs) crontab, created = CrontabSchedule.objects.get_or_create( minute=minute, hour=hour, day_of_month=day_of_month, month_of_year=month_of_year, day_of_week=day_of_week) PeriodicTask.objects.update_or_create( name=f'BotMessage {self.pk}', defaults=dict( crontab=crontab, task="api.tasks.say2group", args=f'["{self.text}", "{self.contact.chat_id}"]')) def delete(self, *args, **kwargs): with transaction.atomic(): task = PeriodicTask.objects.get(name=f'BotMessage {self.pk}') if task.crontab.periodictask_set.count() == 1: task.crontab.delete() else: task.delete() super(BotMessage, self).delete(*args, **kwargs)
def ImageFieldFactory(filename='filename.jpg', url='image_url'): image_file = ImageField() image_file.name = filename image_file.url = url return image_file