class Profile(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE) name = models.CharField(max_length=100) phone = models.CharField(max_length=100, null=True, blank=True) organization = models.CharField( max_length=100, null=True, blank=True, help_text=_('여기에 기입한 조직 이름이 행사 당일 이름표에 표시됩니다.')) image_ori = SorlImageField(upload_to=profile_image, null=True, blank=True, help_text=_('사용자 사진 원본')) image_small = SorlImageField(upload_to=profile_image, null=True, blank=True, help_text=_('사용자 사진 축소본')) bio = models.TextField( max_length=4000, null=True, blank=True, help_text=_('이 내용이 개인 후원자 목록에 노출됩니다. 변경 사항은 최대 60분 이내에 적용됩니다.')) user_code = models.CharField(max_length=20, null=True, blank=True) agreement_receive_advertising_info = models.BooleanField(default=False) def get_absolute_url(self): return reverse('profile') @property def is_empty(self): return self.name == '' or self.phone is None or self.organization is None or self.bio is None
class Partner(models.Model): def make_upload_path(instance, filename): name, extension = os.path.splitext(filename) filename = u'%s%s' % (slugify(name), extension) return u'upload/partners/%s' % filename.lower() title = models.CharField(max_length=100, verbose_name=u'заголовок') image = SorlImageField(upload_to=make_upload_path, verbose_name=u'изображение') url = models.URLField(max_length=100, blank=True) is_active = models.BooleanField(verbose_name=u'активно', default=True) sort = models.IntegerField(verbose_name=u'порядок', default=0) activs = PartnerManager() def get_title(self): return self.title def get_image(self): return self.image def get_url(self): return self.url def __unicode__(self): return self.get_title() class Meta: verbose_name = u'партнер' verbose_name_plural = u'партнеры' ordering = ['sort', '-id'] ################################################################################################################ ################################################################################################################
class NewsInfo(models.Model): name = models.CharField( max_length=200, blank=True, ) description = models.TextField(blank=True, ) dateReleased = models.DateTimeField( "Date Released", blank=True, null=True, ) visible = models.BooleanField(default=False, ) link = models.URLField( "Read More", blank=True, null=True, max_length=400, ) picture = SorlImageField( upload_to="%Y/%m/%d", ) # default="2014/09/09/Curt_Clawson_2014_Congressional_Photo-cropped.jpg", def __unicode__(self): return unicode(self.name) class Meta: verbose_name = u"News Item" verbose_name_plural = u"News Items"
class Banner(models.Model): def make_upload_path(instance, filename): return u'upload/banners/%s' % filename.lower() title = models.CharField(max_length=100, verbose_name=_("title")) image = SorlImageField(upload_to=make_upload_path, verbose_name=_("image"), help_text=_("help text banner image")) url = models.URLField(verbose_name=_("url"), help_text=_("help text banner url"), blank=True) description = models.TextField(max_length=1000, verbose_name=_("description"), blank=True) is_active = models.BooleanField(verbose_name=_("is_active"), default=True) sort = models.IntegerField(verbose_name=_("order"), default=0) objects = models.Manager() activs = BannerManager() def get_title(self): return self.title def get_image(self): return self.image def get_url(self): return self.url def get_description(self): return self.description def __unicode__(self): return self.get_title() def clean(self): r = re.compile('^([a-zA-Z0-9_-]+)\.(jpg|jpeg|png|bmp|gif)$', re.IGNORECASE) if self.get_image(): if not r.findall(os.path.split(self.get_image().url)[1]): raise ValidationError(_("File name validation error.")) class Meta: verbose_name = _("banner") verbose_name_plural = _("banners") ordering = ['sort', '-id'] ################################################################################################################ ################################################################################################################
class ProductGallery(models.Model): def make_upload_path(instance, filename): name, extension = os.path.splitext(filename) filename = u'%s%s' % (slugify(name), extension) return u'upload/portfolio/%s' % filename.lower() product = models.ForeignKey(Product, verbose_name=u'товар') image = SorlImageField(upload_to=make_upload_path, verbose_name=u'изображение') is_main = models.BooleanField(verbose_name=u'главное', default=False) is_active = models.BooleanField(verbose_name=u'активно', default=True) sort = models.IntegerField(verbose_name=u'порядок', default=0) objects = models.Manager() activs = ActiveManager() def get_title(self): return self.image.url def get_image(self): return self.image def __unicode__(self): return self.get_title() class Meta: verbose_name = u'изображение' verbose_name_plural = u'галерея' ordering = ['sort', '-id'] def save(self, *args, **kwargs): if self.is_main: ProductGallery.objects.filter(product=self.product, is_main=True).update(is_main=False) super(ProductGallery, self).save(*args, **kwargs) ########################################################################## ##########################################################################
class NewsArticle(MetaModel, ActiveSortModel, DateCreateModel): def make_upload_path(instance, filename): return make_file_path(filename, u'upload/news/') title = models.CharField(max_length=100, verbose_name=u'заголовок') image = SorlImageField(max_length=100, upload_to=make_upload_path, verbose_name=u'изображение', help_text=u'рекомендованный размер изображения - 350px*200px') announcement = models.TextField(max_length=1000, verbose_name=u'краткое описание') text = RedactorField(max_length=100000, verbose_name=u'полное описание') is_public = models.BooleanField(verbose_name=u'является публичной', default=False) objects = models.Manager() publics = PublicManager() def get_title(self): return self.title def get_image(self): return self.image def get_announcement(self): return self.announcement def get_text(self): return self.text def get_comment_count(self): return self.text def __unicode__(self): return self.get_title() @models.permalink def get_absolute_url(self): return ('news_item_url', (), {'id': self.id}) class Meta: verbose_name = u'новость' verbose_name_plural = u'новости' ordering = ['sort', '-created'] ########################################################################## ##########################################################################
class Banner(models.Model): def make_upload_path(instance, filename): name, extension = os.path.splitext(filename) filename = u'%s%s' % (slugify(name), extension) return u'upload/banners/%s' % filename.lower() title = models.CharField(max_length=100, verbose_name=u'заголовок') image = SorlImageField(upload_to=make_upload_path, verbose_name=u'изображение', help_text=u'150x150 px размер баннера ') description = RedactorField(max_length=1000, verbose_name=u'описание', blank=True) is_active = models.BooleanField(verbose_name=u'активно', default=True) sort = models.IntegerField(verbose_name=u'порядок', default=0) def get_title(self): return self.title def get_image(self): return self.image def get_description(self): return self.description def __unicode__(self): return self.get_title() class Meta: verbose_name = u'баннер' verbose_name_plural = u'баннеры' ordering = ['sort', '-id'] ################################################################################################################ ################################################################################################################
class Profile(models.Model): OAUTH_GITHUB = '1' OAUTH_GOOGLE = '2' OAUTH_FACEBOOK = '3' OAUTH_NAVER = '4' user = models.OneToOneField(UserModel, on_delete=models.CASCADE) oauth_type = models.CharField(max_length=1, choices=( (OAUTH_GITHUB, ('github')), (OAUTH_GOOGLE, ('google')), (OAUTH_FACEBOOK, ('facebook')), (OAUTH_NAVER, ('naver')), ), default=OAUTH_GITHUB) name = models.CharField(max_length=100, blank=True, default='') bio = models.TextField(max_length=4000, blank=True, default='') email = models.EmailField(blank=True, default='') phone = models.CharField(max_length=100, blank=True, default='') organization = models.CharField(max_length=100, blank=True, default='') nationality = models.CharField(max_length=100, blank=True, default='') image = SorlImageField(upload_to='profile', blank=True, default='') avatar_url = models.CharField(max_length=500, blank=True, default='') def __str__(self): return f'{self.name}'
class Item(models.Model): def make_upload_path(instance, filename): name, extension = os.path.splitext(filename) filename = u'%s%s' % (slugify(name), extension) return u'upload/news/item/%s' % filename.lower() title = models.CharField(max_length=500, verbose_name=u'заголовок') slug = models.CharField(max_length=500, verbose_name=u'псевдоним', unique=True) text = RichTextField(max_length=100000, verbose_name=u'текст') image = SorlImageField(upload_to=make_upload_path, verbose_name=u'изображение', blank=True) created_at = models.DateTimeField(verbose_name=u'дата создания', auto_now_add=True) is_active = models.BooleanField(verbose_name=u'активно', default=True) sort = models.IntegerField(verbose_name=u'порядок', default=0) objects = models.Manager() activs = ActiveManager() description = models.TextField(u'описание', blank=True) keywords = models.TextField(u'ключевые слова', blank=True) def get_title(self): return self.title def get_slug(self): return self.slug def get_text(self): return self.text def get_image(self): return self.image def get_created_at(self): return self.created_at def get_description(self): return self.description def get_keywords(self): return self.keywords def __unicode__(self): return self.get_title() @models.permalink def get_absolute_url(self): return ('news_url', (), {'slug': self.slug}) def get_admin_url(self): return reverse('admin:%s_%s_change' % (self._meta.app_label, self._meta.module_name), args=[self.id]) class Meta: verbose_name = u'новость' verbose_name_plural = u'новости' ordering = ['sort', '-created_at', '-id'] #################################################################################################### ####################################################################################################
class Banner(models.Model): name = models.CharField(max_length=100) url = models.CharField(max_length=255, null=True, blank=True) image = SorlImageField(upload_to='banner') desc = models.TextField(null=True, blank=True) begin = models.DateTimeField(null=True, blank=True) end = models.DateTimeField(null=True, blank=True)
class ArticleItem(MetaModel, ActiveSortModel, DateCreateModel, TextAnnouncementModelReq): def make_upload_path(instance, filename): return make_file_path(filename, u'upload/article/') category = models.ForeignKey(CategoryArticle, verbose_name=u'категория', related_name='products_category') title = models.CharField(max_length=100, verbose_name=u'заголовок') image = SorlImageField( max_length=500, upload_to=make_upload_path, verbose_name=u'изображение', help_text=u'рекомендованный размер изображения - 140px*140px') is_public = models.BooleanField(verbose_name=u'является публичной', default=False) objects = models.Manager() publics = PublicManager() def get_title(self): return self.title def get_image(self): return self.image def __unicode__(self): return self.get_title() @models.permalink def get_absolute_url(self): return ('article_item_url', (), {'id': self.id}) def small_image(self): if self.image: f = get_thumbnail(self.image, '100', crop='center', quality=99, format='PNG') html = '<a href="%s"><img src="%s" title="%s" /></a>' return html % (self.image.url, f.url, self.title) else: return u"Нет изображения" small_image.short_description = u"Изображение" small_image.allow_tags = True class Meta: verbose_name = u"статья" verbose_name_plural = u"статьи" ordering = ['sort', 'created', 'id'] ################################################################################################################ ################################################################################################################
class Staff(models.Model): name = models.CharField(max_length=100) display_name = models.CharField(max_length=100, null=True, blank=True) phrase = models.TextField(max_length=1000, null=True, blank=True) image = SorlImageField(upload_to=profile_image, null=True, blank=True) user = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True)
class Photo(models.Model): title = models.CharField(_(u'title'), max_length=50) desctiption = models.CharField(_(u'description'), max_length=100, blank=True) photo = SorlImageField(_(u'photo'), upload_to='photos/%Y/%m/%d', blank=True) def __unicode__(self): return self.title
class PostImage(models.Model): """ 帖子里的图片 """ id = models.UUIDField(primary_key=True) image = SorlImageField(verbose_name='用户上传的图片', upload_to='uploads/community/post_image') uploader = models.ForeignKey(UserProfile, on_delete=models.DO_NOTHING, related_name='%(class)s_uploader') uploadTime = models.DateTimeField('本图片的上传时间', default=now)
class Project(models.Model): title = models.CharField(unique=True, max_length=250) description = models.TextField(max_length=500) url = models.URLField() image = SorlImageField(_('Image'), upload_to=upload_to, default='img/image_not_found.png') class Meta: verbose_name = _('Project') verbose_name_plural = _('Projects')
class PhotoGallery(models.Model): def make_upload_path(instance, filename): return u'upload/gallery/%s' % filename.lower() category = models.ForeignKey(CategoryGallery, verbose_name=_("category"), related_name='gallery_photos') title = models.CharField(max_length=100, verbose_name=_("title")) image = SorlImageField(upload_to=make_upload_path, verbose_name=_("image")) is_main = models.BooleanField(verbose_name=_("is main"), default=False) is_active = models.BooleanField(verbose_name=_("is active"), default=True) order = models.IntegerField(verbose_name=_("order"), default=0) objects = models.Manager() activs = PhotoGalleryManager() def get_title(self): return self.title def get_image(self): return self.image def __unicode__(self): return self.get_title() def clean(self, *args, **kwargs): r = re.compile('^([a-zA-Z0-9_-]+)\.(jpg|jpeg|png|bmp|gif)$', re.IGNORECASE) if self.get_image(): if not r.findall(os.path.split(self.get_image().url)[1]): raise ValidationError(_("File name validation error.")) file = self.image if file.size > 2621440: raise ValidationError( u'Загруженный файл слишком велик - %s. Уменьшите изображение перед загрузкой. Допустимый размер файла до 2.5 МБ' % filesizeformat(file.size)) def save(self, *args, **kwargs): if self.is_main: PhotoGallery.objects.filter(category=self.category, is_main=True).update(is_main=False) super(PhotoGallery, self).save(*args, **kwargs) class Meta: verbose_name = _("gallery photo") verbose_name_plural = _("gallery photos") ordering = ['order', '-id'] ########################################################################## ##########################################################################
class ImageModelReq(models.Model): u'''Абстрактный класс обязательный файл''' def make_upload_path(instance, filename): name, extension = os.path.splitext(filename) filename = u'%s%s' % (slugify(name), extension) return u'upload/image/%s' % filename.lower() image = SorlImageField(max_length=500, upload_to=make_upload_path, verbose_name=u'изображение') class Meta: abstract = True
class ElectronicCatalogItem(MetaModel, ActiveSortModel, DateCreateModel): def make_upload_path(instance, filename): return u'upload/electronic_catalog/%s' % filename.lower() category = models.ForeignKey(CategoryElectronicCatalog, verbose_name=u'категория', related_name='сategory_rel_e_c') is_public = models.BooleanField(verbose_name=u'публичное', default=False, help_text=u'Объявление будет доступно и для незарегистрированных пользователей.') objects = models.Manager() publics = PublicManager() title = models.CharField(max_length=500, verbose_name=u'заголовок') announcement = models.TextField(max_length=10000, verbose_name=u"краткое описание") text = RedactorField(max_length=10000, verbose_name=u"полное описание") image = SorlImageField(max_length=500, upload_to=make_upload_path, verbose_name=u'изображение') cost = models.IntegerField(verbose_name='цена', default=0) def __unicode__(self): return u'%s' % self.title def get_title(self): return self.title def get_announcement(self): return self.announcement def get_text(self): return self.text def get_image(self): return self.image def get_cost(self): return self.cost def get_type_cost(self): return u'руб.' def get_all_cost(self): if self.get_cost(): return u'%s %s' % (self.get_cost(), self.get_type_cost()) else: return u'не указано' @models.permalink def get_absolute_url(self): return ('electronic_catalog_item_url', (), {'id':self.id}) @models.permalink def get_order_url(self): return ('electronic_catalog_order_url', (), {'id':self.id}) @models.permalink def get_profile_electronic_catalog_url(self): return ('profile_electronic_catalog_url', (), {}) class Meta: verbose_name = u'объявление электронного каталога' verbose_name_plural = u'объявления электронного каталога' ordering = ['sort', '-created', '-modified', '-id'] ################################################################################################################ ################################################################################################################
class SocialMeta(models.Model): # opengraph truncates titles over 95chars title = models.CharField(max_length=95, blank=True) description = models.TextField(blank=True) url = models.URLField(blank=True) card = SorlImageField(null=True, blank=True) def __str__(self): related = "" if hasattr(self, "revenueprogram"): related = ("revenueprogram", "Revenue Program") if related: return f'Social media Metatags for {related[1]} "{getattr(self, related[0])}"' return f"Social media Metatags: {self.title}"
class Brand(models.Model): title = models.CharField(max_length=500, verbose_name=_("title")) slug = models.SlugField(unique=True, max_length=500, verbose_name=_("slug"), blank=True) image = SorlImageField(upload_to=u'upload/brand/', verbose_name=_("image"), blank=True, null=True) is_popular = models.BooleanField(verbose_name=_("is popular"), default=False) is_active = models.BooleanField(verbose_name=_("is active"), default=True) sort = models.IntegerField(verbose_name=_("sort"), default=0) def __unicode__(self): return u'%s' % self.title def clean(self): r = re.compile('^([a-zA-Z0-9_-]+)\.(jpg|png|bmp|gif)$') if self.image: if not r.findall(os.path.split(self.image.url)[1]): raise ValidationError(_("File name validation error.")) def small_image(self): if self.image: f = get_thumbnail(self.image, '80x80', crop='center', quality=99) html = '<a href="%s"><img src="%s" title="%s" /></a>' return html % (self.image.url, f.url, self.title) else: return _("No image") small_image.short_description = _("Image") small_image.allow_tags = True def get_dealers(self): return self.dealers.filter(is_banned=False, is_active=True) def get_count_dealers(self): return self.get_dealers().count() def save(self, *args, **kwargs): self.slug = slugify(self.title) super(Brand, self).save(*args, **kwargs) class Meta: verbose_name = _("brand") verbose_name_plural = _("brands") ordering = ['sort', 'title']
class Submission(models.Model): ''' PhotoCompetition Model Class - Candidates Submission ''' DEVICE_CHOICE = ( ('MobilePhone', _('手机')), ('Camera', _('相机')), ) CATEGORY_CHOICE = ( ('Nature', _('风景')), ('Culture', _('人文')), ) THEME_CHOICE = ( ('Beauty', _('美的定义')), ('Water', _('水的模样')), ) submissionId = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) submissionUserId = models.ForeignKey(adminModel.UserProfile, on_delete=models.DO_NOTHING) submissionTime = models.DateTimeField(auto_now_add=True) deviceType = models.CharField(verbose_name=_("设备类型"), choices=DEVICE_CHOICE, max_length=30, default="MobilePhone", null=True) categoryType = models.CharField(verbose_name=_("题材类型"), choices=CATEGORY_CHOICE, max_length=30, default="Nature", null=True) themeType = models.CharField(verbose_name=_("主题类型"), choices=THEME_CHOICE, max_length=30, default="Beauty", null=True) upload_photo = SorlImageField(verbose_name=_("上传作品"), null=True, upload_to=_GetUserDir) description = models.CharField(verbose_name=_("作品简述"), max_length=250) def get_absolute_url(self): return reverse("myCSSAhub:PhotoComp:submission-detail", kwargs={"pk": self.pk})
class ActionArticle(models.Model): title = models.CharField(max_length=100, verbose_name=_("title")) image = SorlImageField(upload_to=u'upload/action/', verbose_name=_("image"), blank=True, null=True, help_text=_("If exist flash then it has show.")) flash = models.FileField(upload_to=u'upload/action/', verbose_name=_("flash"), help_text=_('Recommended size 250x150 px.'), blank=True, null=True) text = TinymceField.HTMLField(max_length=100000, verbose_name=_("text")) created_at = models.DateTimeField(verbose_name=_("date_created"), default=datetime.datetime.now()) is_active = models.BooleanField(verbose_name=_("is_active"), default=True) sort = models.IntegerField(verbose_name=_("order"), default=0) def __unicode__(self): return u'%s' % self.title @models.permalink def get_absolute_url(self): return ('action_url', (), {}) @models.permalink def get_item_url(self): return ('action_item_url', (), {'id': self.id}) def clean(self): r = re.compile('^([a-zA-Z0-9_-]+)\.([a-zA-Z0-9_-]+)$') if self.image: if not r.findall(os.path.split(self.image.url)[1]): raise ValidationError(_("File name validation error")) if self.flash: if not r.findall(os.path.split(self.flash.url)[1]): raise ValidationError(_("File name validation error")) class Meta: verbose_name = _("action article") verbose_name_plural = _("actions") ordering = ['sort', '-created_at', '-id'] ########################################################################## ##########################################################################
class NewsArticle(models.Model): def make_upload_path(instance, filename): name, extension = os.path.splitext(filename) filename = u'%s%s' % (slugify(name), extension) return u'upload/news/%s' % filename.lower() title = models.CharField(max_length=100, verbose_name=u'заголовок') image = SorlImageField(upload_to=make_upload_path, verbose_name=u'изображение', blank=True) announcement = models.TextField(max_length=500, verbose_name=u'анонс') text = RedactorField(max_length=100000, verbose_name=u'текст') slug = models.SlugField(max_length=500, verbose_name=u'псевдоним', unique=True) created_at = models.DateTimeField(verbose_name=u'дата создания') is_active = models.BooleanField(verbose_name=u'активно', default=True) sort = models.IntegerField(verbose_name=u'порядок', default=0) description = models.TextField(u'описание', blank=True) keywords = models.TextField(u'ключевые слова через запятую', blank=True) def get_title(self): return self.title def get_image(self): return self.image def get_announcement(self): return self.announcement def get_text(self): return self.text def get_created_at(self): return self.created_at def get_id(self): return self.id def __unicode__(self): return u'%s' % self.get_title() @models.permalink def get_absolute_url(self): return ('news_url', (), {}) @models.permalink def get_item_url(self): return ('news_item_url', (), {'slug':self.slug}) def get_admin_url(self): return u'/admin/news/newsarticle/%d/' % self.id class Meta: verbose_name = u'новость' verbose_name_plural = u'новости' ordering = ['sort', '-created_at'] ########################################################################## ##########################################################################
class DealerBanner(models.Model): dealer = models.ForeignKey(Dealer, verbose_name=_("dealer")) title = models.CharField(max_length=500, verbose_name=_("title")) image = SorlImageField( upload_to=u'upload/banner/image/', verbose_name=_("image"), blank=True, null=True, help_text=_("Help text image or flash banner 250x100 px")) flash = models.FileField(upload_to=u'upload/banner/flash/', verbose_name=_("flash"), blank=True, null=True) width = models.IntegerField(verbose_name=_("width"), default=250, help_text=_("0<width<250")) height = models.IntegerField(verbose_name=_("height"), default=200) site = models.URLField(verbose_name=_("site"), help_text=_("Example: http://web-aspect.ru"), blank=True) is_active = models.BooleanField(verbose_name=_("is active"), default=True) sort = models.IntegerField(verbose_name=_("order"), default=0) def __unicode__(self): return u'%s' % self.title @models.permalink def get_admin_url(self): return ('banner_admin_url', (), {'id': self.id}) def clean(self): r = re.compile('^([a-zA-Z0-9_-]+)\.([a-zA-Z0-9_-]+)$') if self.image: if not r.findall(os.path.split(self.image.url)[1]): raise ValidationError(_("File name validation error")) if self.flash: if not r.findall(os.path.split(self.flash.url)[1]): raise ValidationError(_("File name validation error")) if self.width > 250: raise ValidationError(_("Error width banner.")) class Meta: verbose_name = _("banner") verbose_name_plural = _("banners") ordering = ['sort', '-id']
class Social(models.Model): def make_upload_path(instance, filename): name, extension = os.path.splitext(filename) filename = u'%s%s' % (slugify(name), extension) return u'upload/contacts/social/%s' % filename.lower() contacts = models.ForeignKey(Contacts, verbose_name=u'контакты') title = models.CharField(max_length=100, verbose_name=u'название', blank=True) social_url = models.URLField(max_length=100, verbose_name=u'ссылка', blank=True) icon = SorlImageField(upload_to=make_upload_path, verbose_name=u'иконка', blank=True) is_active = models.BooleanField(verbose_name=u'активно', default=True) sort = models.IntegerField(verbose_name=u'порядок', default=0) objects = models.Manager() activs = ActiveManager() def get_title(self): return self.title def get_social_url(self): return re.sub(u'(^http://|/$)', u'', self.social_url) def get_full_url(self): return self.social_url def get_icon(self): return self.icon def __unicode__(self): return u'%s' % self.get_title() class Meta: verbose_name = u'социальная сеть' verbose_name_plural = u'социальные сети' ordering = ['sort', 'id'] #################################################################################################### ####################################################################################################
class Profile(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE) name = models.CharField(max_length=100) phone = models.CharField(max_length=100, null=True, blank=True) organization = models.CharField( max_length=100, null=True, blank=True, help_text=_('여기에 기입한 조직 이름이 행사 당일 이름표에 표시됩니다.')) image = SorlImageField(upload_to=profile_image, null=True, blank=True) bio = models.TextField(max_length=4000, null=True, blank=True) def get_absolute_url(self): return reverse('profile') @property def is_empty(self): return self.name == '' or self.phone is None or self.organization is None or self.bio is None
class Profile(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE) name = models.CharField(max_length=100) phone = models.CharField(max_length=100, null=True, blank=True) organization = models.CharField(max_length=100, null=True, blank=True) image = SorlImageField(upload_to='profile', null=True, blank=True) bio = models.TextField(max_length=4000, null=True, blank=True) @receiver(post_save, sender=User) def create_user_profile(sender, instance, created, **kwargs): if created: Profile.objects.create(user=instance) def get_absolute_url(self): return reverse('profile') @property def is_empty(self): return self.name == '' or self.phone is None or self.organization is None or self.bio is None
class Sponsor(models.Model): class Meta: ordering = ['paid_at', 'id'] slug = models.SlugField(max_length=100, null=True, blank=True, help_text='후원사 상세 페이지의 path로 사용됩니다') creator = models.ForeignKey(User, on_delete=models.CASCADE, help_text=_('후원사를 등록한 유저')) name = models.CharField(max_length=255, help_text=_('후원사의 이름입니다. 서비스나 회사 이름이 될 수 있습니다.')) level = models.ForeignKey(SponsorLevel, null=True, on_delete=models.SET_NULL, blank=True, help_text=_('후원을 원하시는 등급을 선택해주십시오. 모두 판매된 등급은 선택할 수 없습니다.')) desc = models.TextField(null=True, blank=True, help_text=_('후원사 설명입니다. 이 설명은 홈페이지에 게시됩니다.')) manager_name = models.CharField(max_length=100, help_text=_( '준비위원회와 후원과 관련된 논의를 진행할 담당자의 이름을 입력해주십시오.')) manager_email = models.CharField( max_length=100, help_text=_('입력하신 메일로 후원과 관련된 안내 메일이나 문의를 보낼 예정입니다. 후원 담당자의 이메일 주소를 입력해주십시오.')) business_registration_number = models.CharField(max_length=100, help_text=_('후원사 사업자 등록번호입니다. 세금 계산서 발급에 사용됩니다.')) business_registration_file = models.FileField( upload_to=registration_file_upload_to, help_text=_('후원사 사업자 등록증 스캔본입니다. 세금 계산서 발급에 사용됩니다.')) url = models.CharField(max_length=255, null=True, blank=True, help_text=_('파이콘 홈페이지에 공개되는 후원사 홈페이지 주소입니다.')) logo_image = SorlImageField(upload_to=logo_image_upload_to, null=True, blank=True, help_text=_('홈페이지에 공개되는 후원사 로고 이미지입니다.')) comment = models.TextField(null=True, blank=True, help_text=_('파이콘 한국 준비위원회에게 행사나 후원 관련해 전달할 내용을 추가로 기입합니다. 이 내용은 홈페이지에 게시되지 않습니다.')) paid_at = models.DateTimeField(null=True, blank=True, help_text='후원금이 입금된 일시입니다. 아직 입금되지 않았을 경우 None이 들어갑니다.') submitted = models.BooleanField(default=False, help_text='사용자가 제출했는지 여부를 저장합니다. 요청이 제출되면 준비위원회에서 검토하고 받아들일지를 결정합니다') accepted = models.BooleanField(default=False, help_text='후원사로 확정되었을 경우 True로 설정됩니다.') created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) def __str__(self): return f'{self.name}/{self.level}' def get_absolute_url(self): return reverse('sponsor', args=[self.pk])
class Category (models.Model): def make_upload_path(instance, filename): name, extension = os.path.splitext(filename) filename = u'%s%s' % (slugify(name), extension) return u'upload/catalog/category/%s' % filename.lower() title = models.CharField(max_length=100, verbose_name=u'название') image = SorlImageField(upload_to=make_upload_path, verbose_name=u'изображение', blank=True, null=True) announcement= models.TextField(max_length=500, verbose_name=u'анонс') text = RedactorField(max_length=100000, verbose_name=u'текст', blank=True, null=True) slug = models.SlugField(max_length=500, verbose_name=u'псевдоним', unique=True) is_active = models.BooleanField(verbose_name=u'активно', default=True) sort = models.IntegerField(verbose_name=u'порядок', default=0) description = models.TextField(u'описание', blank=True) keywords = models.TextField(u'ключевые слова через запятую', blank=True) def get_title(self): return self.title def get_image(self): return self.image def get_announcement(self): return self.announcement def get_text(self): return self.text def __unicode__(self): return u'%s' % self.get_title() @models.permalink def get_absolute_url(self): return ('catalog_url', (), {}) @models.permalink def get_category_url(self): return ('category_url', (), {'slug':self.slug}) def get_admin_url(self): return u'/admin/catalog/category/%d/' % self.id def get_admin_product_list_url(self): return u'/admin/catalog/product/?category__id__exact=%d' % self.id class Meta: verbose_name = u'категория' verbose_name_plural = u'категории' ordering = ['sort', '-id']
class Product (models.Model): def make_upload_path(instance, filename): name, extension = os.path.splitext(filename) filename = u'%s%s' % (slugify(name), extension) return u'upload/catalog/product/%s' % filename.lower() category = models.ForeignKey(Category, verbose_name=u'категория') title = models.CharField(max_length=100, verbose_name=u'название') slug = models.SlugField(max_length=500, verbose_name=u'псевдоним', unique=True) code = models.CharField(max_length=100, verbose_name=u'номер в каталоге', blank=True) text = RedactorField(max_length=100000, verbose_name=u'текст') image = SorlImageField(upload_to=make_upload_path, verbose_name=u'изображение', blank=True, null=True) file = models.FileField(upload_to=make_upload_path, verbose_name=u'файл', blank=True) is_active = models.BooleanField(verbose_name=u'активно', default=True) sort = models.IntegerField(verbose_name=u'порядок', default=0) description = models.TextField(u'описание', blank=True) keywords = models.TextField(u'ключевые слова через запятую', blank=True) def get_title(self): return self.title def get_image(self): return self.image def get_code(self): return self.code def get_text(self): return self.text def get_file(self): return self.file def __unicode__(self): return u'%s' % self.get_title() @models.permalink def get_absolute_url (self): return ('product_url', (), {'slug_category':self.category.slug, 'slug':self.slug}) def get_admin_url(self): return u'/admin/catalog/product/%d/' % self.id class Meta: verbose_name = u'товар' verbose_name_plural = u'продукция' ordering = ['sort', '-id'] ########################################################################## ##########################################################################