class WebContent(models.Model): content = RichTextUploadingField(verbose_name="内容") class Meta: managed = False db_table = 'web_content'
class BuildingDetial(models.Model): '''楼盘详情''' '''主表''' '''类型''' land = models.ForeignKey(LandDistrict, on_delete=models.CASCADE, null=True, blank=True, verbose_name='地区') train = models.ForeignKey(SubwayStation, on_delete=models.CASCADE, null=True, blank=True, verbose_name='地铁站') budling_other = models.ForeignKey(BuildingClassfiy, on_delete=models.CASCADE, null=True, blank=True, verbose_name='楼盘其他类型') '''销售信息''' building_name = models.CharField(max_length=20, verbose_name='楼房名称') total_price = models.CharField(max_length=10, blank=True, null=True, verbose_name='参考总价') unit_price = models.CharField(max_length=100, blank=True, null=True, verbose_name='参考单价') house_section = models.CharField(max_length=20, blank=True, null=True, verbose_name='户型') sale_stage = models.CharField(max_length=20, blank=True, null=True, verbose_name='销售阶段') sale_stage_time = models.CharField(max_length=20, blank=True, null=True, verbose_name='销售阶段截止日期') sale_building_location = models.CharField(max_length=50,blank=True, null=True, verbose_name='售楼地址') premises_location = models.CharField(max_length=50,blank=True, null=True, verbose_name='楼盘地址') delivery_time = models.CharField(max_length=25, blank=True, null=True, verbose_name='交房时间') '''经纬度''' longitude = models.CharField(max_length=255, blank=True, null=True, verbose_name='经度') latitude = models.CharField(max_length=255, blank=True, null=True, verbose_name='纬度') '''基本信息''' building_nickname = models.CharField(max_length=20, blank=True, null=True, verbose_name='楼盘别名') building_classfiy = models.CharField(max_length=20, blank=True, null=True, verbose_name='楼盘类型') equity_year = models.CharField(max_length=20, blank=True, null=True, verbose_name='产权年限') green_rate = models.CharField(max_length=10, blank=True, null=True, verbose_name='绿化率') volume_rate = models.CharField(max_length=10, blank=True, null=True, verbose_name='容积率') stall_message = models.CharField(max_length=20, blank=True, null=True, verbose_name='车位信息') cube_count = models.CharField(max_length=20, blank=True, null=True, verbose_name='楼栋数') all_house_count = models.CharField(max_length=20, blank=True, null=True, verbose_name='总户数') floor_space = models.CharField(max_length=20, blank=True, null=True, verbose_name='占地面积') covered_area = models.CharField(max_length=20, blank=True, null=True, verbose_name='建筑面积') covered_classfiy = models.CharField(max_length=20, blank=True, null=True, verbose_name='建筑类型') covered_tier = models.CharField(max_length=20, blank=True, null=True, verbose_name='建筑楼层') company = models.CharField(max_length=50, blank=True, null=True, verbose_name='物业公司') company_money = models.CharField(max_length=50, blank=True, null=True, verbose_name='物业费') upstart = models.CharField(max_length=50, blank=True, null=True, verbose_name='开发商') tier_condition = models.CharField(max_length=100, blank=True, null=True, verbose_name='楼层状况') '''周边配套''' train_traffic = models.CharField(max_length=255, blank=True, null=True, verbose_name='地铁交通') bus_site = models.CharField(max_length=255, blank=True, null=True, verbose_name='公交站点') school = models.CharField(max_length=255, blank=True, null=True, verbose_name='学校') bank = models.CharField(max_length=255, blank=True, null=True, verbose_name='银行') catering = models.CharField(max_length=100, blank=True, null=True, verbose_name='餐饮') hospital = models.CharField(max_length=255, blank=True, null=True, verbose_name='医院') shopping = models.CharField(max_length=255, blank=True, null=True, verbose_name='购物中心') park = models.CharField(max_length=255, blank=True, null=True, verbose_name='公园') other_mating = models.TextField(blank=True, null=True, verbose_name='其他配套') '''简介''' building_intro = RichTextUploadingField(blank=True, null=True, verbose_name='楼盘简介') '''广告与关注''' AD_INDEX_CHOICES = ((0, 'yes'),(1, 'no')) AD_BUILDING_CHOICES = ((0, 'yes'),(1, 'no')) LUN_BO_CHOICES = ((0, 'yes'),(1, 'no')) if_index_advertising = models.SmallIntegerField(choices=AD_INDEX_CHOICES, default=0, verbose_name='是否在首页广告') if_lunbo_choice = models.SmallIntegerField(choices=LUN_BO_CHOICES, default=0, verbose_name='是否轮播图') if_building_detail_advertising = models.SmallIntegerField(choices=AD_BUILDING_CHOICES, default=0, verbose_name='是否在楼盘广告') attention_degree = models.IntegerField(default=0, blank=True, null=True, verbose_name='浏览量') comment_count = models.IntegerField(default=0, blank=True, null=True, verbose_name='评论量') '''开盘信息''' open_house_number = models.CharField(max_length=50, blank=True, null=True, verbose_name='开盘栋数') open_price = models.CharField(blank=True, null=True, max_length=50, verbose_name='开盘价格') decorate_situation = models.CharField(max_length=20, blank=True, null=True, verbose_name='装修情况') open_house_section = models.CharField(max_length=20, blank=True, null=True, verbose_name='开盘户型区间') open_house_count = models.CharField(max_length=20,blank=True, null=True, verbose_name='开盘房源套数') registration_way = models.CharField(max_length=20, blank=True, null=True, verbose_name='报名方式') cool_captial_request = models.CharField(max_length=20, blank=True, null=True, verbose_name='冻资要求') '''楼盘房源类型''' house_count = models.CharField(max_length=50,blank=True, null=True, verbose_name='房源套数') #??切换楼栋? people_count = models.CharField(max_length=30,blank=True, null=True, verbose_name='报名人数') win_probability = models.CharField(max_length=30,blank=True, null=True, verbose_name='摇中概率') will_sale_number = models.CharField(max_length=15, null=True, blank=True, verbose_name='预售证号') give_number_time = models.DateField(auto_now_add=False, null=True, blank=True, verbose_name='发证时间') lottery_count = models.CharField(max_length=50, null=True, blank=True, verbose_name='摇号批次') building_create_time = models.DateField(auto_now_add=True, blank=True, null=True, verbose_name='开盘时间') create_time = models.DateTimeField(auto_now_add=True, blank=True, null=True, verbose_name='数据创建时间') union_building_test_id = models.IntegerField(blank=True, null=True, verbose_name='楼盘联合id') class Meta: db_table = 'tb_building_detial' verbose_name = '楼盘详情' managed = True verbose_name_plural = verbose_name def __str__(self): return '%s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s' % (self.id,self.will_sale_number,self.give_number_time,self.lottery_count, self.building_create_time, self.win_probability, self.people_count, self.house_count, self.cool_captial_request, self.registration_way, self.open_house_count, self.open_house_section, self.decorate_situation, self.open_house_number, self.comment_count, self.attention_degree, self.if_index_advertising, self.if_building_detail_advertising, self.building_intro, self.other_mating, self.park, self.shopping, self.catering, self.hospital, self.bank, self.bus_site, self.train_traffic, self.tier_condition, self.upstart, self.company, self.covered_tier, self.covered_classfiy, self.covered_area, self.floor_space, self.all_house_count, self.cube_count, self.stall_message, self.volume_rate, self.green_rate, self.equity_year, self.building_classfiy, self.building_nickname, self.latitude, self.longitude, self.delivery_time, self.premises_location, self.sale_building_location, self.sale_stage, self.house_section, self.unit_price, self.total_price, self.building_name, self.budling_other.name, self.train.name, self.land.name, self.if_lunbo_choice, self.company_money)
class Post(TimeStampedModel, SoftDeletableModel, models.Model): title = models.CharField(_('Title'), max_length=250) content = RichTextUploadingField(_('Content')) author = models.ForeignKey(User, on_delete=models.CASCADE)
class UserProfile(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE) bio = RichTextUploadingField('Biografia', null=True, blank=True) website = models.URLField(default='') image = models.ImageField(upload_to='profile_image', blank=True)
class Opportunity(models.Model): locations = ( ('Eastern Cape', 'Eastern Cape'), ('Free State', 'Free State'), ('Gauteng', 'Gauteng'), ('KwaZulu-Natal', 'KwaZulu-Natal'), ('Limpopo', 'Limpopo'), ('Mpumalanga', 'Mpumalanga'), ('North West', 'North West'), ('Northern Cape', 'Northern Cape'), ('Western Cape', 'Western Cape'), ) terms = ( ('Fixed Term', 'Fixed Term'), ('Permanent', 'Permanent'), ) name = models.CharField(max_length=100) slug = models.SlugField(max_length=150, unique=True) category = models.ForeignKey(Category, on_delete=models.CASCADE, default=2) date_posted = models.DateTimeField(default=timezone.now) expect = models.TextField(max_length=150, blank=True) description = RichTextUploadingField() company_name = models.CharField(max_length=100, blank=True) company_email = models.EmailField(blank=True) role = models.CharField(max_length=50, blank=True) reporting_to = models.CharField(max_length=50, blank=True) employment_term = models.CharField(max_length=20, choices=terms, blank=True) location = models.CharField(max_length=20, choices=locations) city = models.CharField(max_length=50, blank=True) company_logo = models.FileField( upload_to='opportunities/', default='/static/images/wecanchangeopportunity.jpg') ngo_or_npo = models.ForeignKey( Organisation, blank=True, on_delete=models.CASCADE, null=True, help_text=u'Assign Opportunity to NGO, NPO or leave blank', ) company = models.ForeignKey( Company, blank=True, on_delete=models.CASCADE, null=True, help_text=u'Assign Opportunity to Company or leave blank', ) service_provider = models.ForeignKey( ServiceProvider, blank=True, help_text=u'Assign post to Service Provider', on_delete=models.CASCADE, null=True) class Meta: verbose_name = u'Jobs' verbose_name_plural = u'Jobs' def __str__(self): return self.name
class Post(models.Model): """ Data model for blog posts. Модель данных для постов блога. """ STATUS_CHOICES = (('draft', 'черновик'), ('published', 'опубликовано')) title = models.CharField(verbose_name='Заголовок поста', max_length=250) slug = models.SlugField(max_length=250, blank=True, unique_for_date='date_published') author = models.ForeignKey(Author, verbose_name='Автор поста', on_delete=models.CASCADE, related_name='publications_posts') category = models.ForeignKey(Category, verbose_name='Категория', on_delete=models.CASCADE, related_name='publications_category') post_prevew = RichTextUploadingField( verbose_name='Предварительный просмотр поста', max_length=100) body = RichTextUploadingField(verbose_name='Содержание поста') date_published = models.DateTimeField(verbose_name='Дата публикации поста', default=timezone.now) created = models.DateTimeField(verbose_name='Дата написания поста', auto_now_add=True) updated = models.DateTimeField(verbose_name='Дата обновления поста', auto_now=True) status = models.CharField(verbose_name='Статус', max_length=10, choices=STATUS_CHOICES, default='draft') hits = models.IntegerField(verbose_name='Количество просмотров', default=0) comments = models.IntegerField(verbose_name='Количество комментариев', default=0) # Model manager # Менеджер модели published = PublishedManager() # Manager tags # Менеджер тегов tags = TaggableManager() class Meta: ordering = ('-date_published', ) verbose_name = 'пост' verbose_name_plural = 'посты' db_table = 'posts' def __str__(self): return self.title def save(self, *args, **kwargs): """ Overridden standard save() function. Serves for automatic slug creation. If the post has no slug, the slugify() function automatically forms it from the passed header, after which the post object is saved. Переопределенная стандартная функция save(). Служит для автоматического формирования slug. Если у поста нет слага, функция slugify() автоматически формирует его из переданного заголовка, после чего происходит сохранение объекта поста. """ if not self.slug: self.slug = slugify(unidecode(self.title)) super(Post, self).save(*args, **kwargs) def get_absolute_url(self): """ The function generates direct links. Функция формирует прямые ссылки. """ return reverse('publications:post_detail', args=[ self.date_published.year, self.date_published.month, self.date_published.day, self.slug ])
class Post(models.Model): title = models.CharField(max_length=100, ) slug = models.SlugField(max_length=100, unique=True) created_on = models.DateTimeField(auto_now_add=True) updated_on = models.DateTimeField(auto_now=True) meta_description = models.TextField(max_length=160, null=True, blank=True) user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) updated_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='updated_by', null=True, blank=True) description = models.TextField() content = RichTextUploadingField() category = models.ForeignKey(Category, on_delete=models.PROTECT) tags = models.ManyToManyField(Tags, related_name='rel_posts', blank=True) status = models.CharField(max_length=10, choices=STATUS_CHOICE, default='Drafted') keywords = models.TextField(max_length=500, blank=True) image = models.ImageField(upload_to='blog/post/%Y/%m/%D', default='blog/post/post.png') class Meta: ordering = ['-updated_on'] def save(self, *args, **kwargs): """ Save method for Post. Generate a slug based on the title if the post doesn't exist yet.- """ if not self.pk: self._generate_slug() super().save(*args, **kwargs) if self.image != None: img = Image.open(self.image.path) if img.height > 450 or img.width > 450: output_size = (450, 450) img.thumbnail(output_size) img.save(self.image.path) def __str__(self): return self.title def is_deletable_by(self, user): if self.user == user or user.is_superuser: return True return False def _generate_slug(self): """ Generate a slug based on the title of the post If the slug is already taken, one or two digits will be added at the end of the slug and will increment as long as the slug already exist until reaching a non-existant result. The slug is truncated to 57 character in order to add the unique digits at the end of it. """ max_length = self._meta.get_field('slug').max_length - 3 value = self.title slug_result = slug_original = \ slugify(value, allow_unicode=False)[:max_length] for i in itertools.count(1): if not Post.objects.filter(slug=slug_result).exists(): break slug_result = f'{slug_original}-{i}' self.slug = slug_result def get_absolute_url(self): """Get the absolute url of the object""" return reverse("blog:post-detail", kwargs={"slug": self.slug}) def status_toggle(self): """ Toggle beetwen the status""" if self.status == 'Drafted': self.status = 'Published' else: self.status = 'Drafted' self.save()
class Resource(models.Model): # Basic Information fields id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) erp_bai_0_id = models.CharField(max_length=100, unique=True) erp_bai_1_name = models.CharField(max_length=100, unique=True) erp_bai_2_organisation = models.ForeignKey( Organisation, on_delete=models.PROTECT, blank=False, null=True, related_name="organisation_services") erp_bai_3_providers = models.ManyToManyField( Organisation, blank=True, related_name="provided_services") erp_bai_4_webpage = models.EmailField(default=None, blank=False, null=True) # Marketing Information fields erp_mri_1_description = RichTextUploadingField(max_length=1000, default=None, blank=True, null=True) erp_mri_2_tagline = models.TextField(max_length=100, default=None, blank=True, null=True) erp_mri_3_logo = models.EmailField(default=None, blank=True, null=True) erp_mri_4_mulitimedia = models.EmailField(default=None, blank=True, null=True) erp_mri_5_use_cases = models.TextField(default=None, blank=True, null=True) # Classification information erp_cli_1_scientific_domain = models.ManyToManyField( Domain, blank=True, related_name='domain_resources') erp_cli_2_scientific_subdomain = models.ManyToManyField( Subdomain, blank=True, related_name='subdomain_resources') erp_cli_3_category = models.ManyToManyField( Category, blank=True, related_name='categorized_resources') erp_cli_4_subcategory = models.ManyToManyField( Subcategory, blank=True, related_name='subcategorized_resources') erp_cli_5_target_users = models.ManyToManyField(TargetUser, blank=True) erp_cli_6_access_type = models.ManyToManyField(AccessType, blank=True) erp_cli_7_access_mode = models.ManyToManyField(AccessMode, blank=True) erp_cli_8_tags = models.TextField(max_length=255, default=None, blank=True, null=True) # Management Information erp_mgi_1_helpdesk_webpage = models.URLField(max_length=255, default=None, blank=True, null=True) erp_mgi_2_user_manual = models.URLField(max_length=255, default=None, blank=True, null=True) erp_mgi_3_terms_of_use = models.URLField(max_length=255, default=None, blank=True, null=True) erp_mgi_4_privacy_policy = models.URLField(max_length=255, default=None, blank=True, null=True) erp_mgi_5_access_policy = models.URLField(max_length=255, default=None, blank=True, null=True) erp_mgi_6_sla_specification = models.URLField(max_length=255, default=None, blank=True, null=True) erp_mgi_7_training_information = models.URLField(max_length=255, default=None, blank=True, null=True) erp_mgi_8_status_monitoring = models.URLField(max_length=255, default=None, blank=True, null=True) erp_mgi_9_maintenance = models.URLField(max_length=255, default=None, blank=True, null=True) # Geographical and Language Availability fields erp_gla_1_geographical_availability = models.CharField(max_length=255, default=None, blank=True, null=True) erp_gla_2_language = models.TextField(default=None, blank=True, null=True) # Resource Location Information erp_rli_1_geographic_location = models.TextField(default='Other', blank=True, null=True) # Contact Information main_contact = models.ForeignKey(ContactInformation, blank=True, null=True, on_delete=models.SET_NULL, related_name="main_contact_services") public_contact = models.ForeignKey(ContactInformation, blank=True, null=True, on_delete=models.SET_NULL, related_name="public_contact_services") erp_coi_13_helpdesk_email = models.EmailField(default=None, blank=True, null=True) erp_coi_14_security_contact_email = models.EmailField(default=None, blank=True, null=True) # Maturity Information erp_mti_1_technology_readiness_level = models.ForeignKey(TRL, blank=False, null=True) erp_mti_2_life_cycle_status = models.ForeignKey(LifeCycleStatus, blank=False, null=True) erp_mti_3_certifications = RichTextUploadingField(default=None, blank=True, null=True) erp_mti_4_standards = RichTextUploadingField(default=None, blank=True, null=True) erp_mti_5_open_source_technologies = RichTextUploadingField(default=None, blank=True, null=True) erp_mti_6_version = models.CharField(max_length=255, default=None, blank=True, null=True) erp_mti_7_last_update = models.CharField(max_length=255, blank=True, null=True) erp_mti_8_changelog = RichTextUploadingField(default=None, blank=True, null=True) # Dependencies Information fields required_resources = models.ManyToManyField('self', blank=True, symmetrical=False, related_name='is_required_by') related_resources = models.ManyToManyField( 'self', blank=True, symmetrical=False, related_name='set_as_related_by') erp_dei_3_related_platforms = models.TextField(default=None, blank=True, null=True) # Attribution Information erp_ati_1_funding_body = models.ManyToManyField( FundingBody, blank=True, related_name='funded_body_resources') erp_ati_2_funding_program = models.ManyToManyField( FundingProgram, blank=True, related_name='funded_program_resources') erp_ati_3_grant_project_name = models.CharField(max_length=255, default=None, blank=True, null=True) # Access and Order Information erp_aoi_1_order_type = models.ForeignKey(OrderType, blank=True, null=True, related_name='resources') erp_aoi_2_order = models.URLField(default=None, blank=True, null=True) # Financial Information erp_fni_1_payment_model = models.URLField(default=None, blank=True, null=True) erp_fni_2_pricing = models.URLField(default=None, blank=True, null=True) state = models.CharField(choices=RESOURCE_STATES, max_length=30, default='draft') # Datetime fields created_at = models.DateTimeField(auto_now_add=True, null=True) updated_at = models.DateTimeField(auto_now=True) published_at = models.DateTimeField(blank=True, null=True) eosc_id = models.CharField(max_length=255, blank=True, null=True) eosc_published_at = models.DateTimeField(blank=True, null=True) eosc_updated_at = models.DateTimeField(blank=True, null=True) eosc_state = models.CharField(max_length=255, blank=True, null=True) def __unicode__(self): return str(self.erp_bai_0_id) @property def erp_bai_2_organisation_public(self): if self.erp_bai_2_organisation.state == 'published': return self.erp_bai_2_organisation_id else: return None @property def erp_bai_3_providers_public(self): return self.erp_bai_3_providers.filter(state='published') @property def erp_cli_3_category_verbose(self): return ", ".join(o.name for o in self.erp_cli_3_category.all()) @property def erp_cli_4_subcategory_verbose(self): return ", ".join(o.name for o in self.erp_cli_4_subcategory.all()) @property def erp_cli_1_scientific_domain_verbose(self): return ", ".join(o.name for o in self.erp_cli_1_scientific_domain.all()) @property def erp_cli_2_scientific_subdomain_verbose(self): return ", ".join(o.name for o in self.erp_cli_2_scientific_subdomain.all()) @property def erp_bai_3_providers_verbose(self): return ", ".join(o.epp_bai_1_name for o in self.erp_bai_3_providers.all()) @property def required_resources_ids(self): return ", ".join(o.erp_bai_0_id for o in self.required_resources.all()) @property def related_resources_ids(self): return ", ".join(o.erp_bai_0_id for o in self.related_resources.all()) @property def erp_dei_1_required_resources_public(self): return self.required_resources.filter(state='published') @property def erp_dei_2_related_resources_public(self): return self.related_resources.filter(state='published') @property def erp_cli_5_target_users_verbose(self): return ", ".join(o.user for o in self.erp_cli_5_target_users.all()) def save(self, *args, **kwargs): self.erp_bai_0_id = self.erp_bai_0_id.strip() self.erp_bai_1_name = self.erp_bai_1_name.strip() if self.state == 'published' and not self.published_at: self.published_at = timezone.now() clean_html_fields(self) super(Resource, self).save(*args, **kwargs) @property def resource_admins_ids(self): resource_adminships = ResourceAdminship.objects.filter( resource=self, state="approved") res = [] for r in resource_adminships: res.append(str(r.admin.pk)) return ','.join(res) @property def resource_admins(self): resource_adminships = ResourceAdminship.objects.filter( resource=self, state="approved") res = [] for r in resource_adminships: res.append(r.admin) return res @property def pending_resource_admins_ids(self): resource_adminships = ResourceAdminship.objects.filter(resource=self, state="pending") res = [] for r in resource_adminships: res.append(str(r.admin.pk)) return ','.join(res) @property def rejected_resource_admins_ids(self): resource_adminships = ResourceAdminship.objects.filter( resource=self, state="rejected") res = [] for r in resource_adminships: res.append(str(r.admin.pk)) return ','.join(res)
class notification(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE) notify = RichTextUploadingField(null=True)
class Question(models.Model): """ Question objects store the question and the answers to that question There are three types of questions: 1. MCQs: The options are stored in question.options as a json and the correct answer is the index value of the option starting from 1. 2. True or False: The answer is stored as 'T' of 'F'. 3. Text: The answer is stored as some string. answer_options = [ ('T', 'True'), ('F', 'False), ('1', 'One'), ('2', 'Two'), ('3', 'Three'), ('4', 'Four'), ('<str>', '<str>') # This is why we cannot enforce these options ] """ QUESTION_TYPE_CHOICES = [('mcq', 'Multiple Choice Question'), ('bool', 'True or False'), ('text', 'Text Answer')] class Meta: verbose_name = 'Question' verbose_name_plural = 'Questions' ordering = ['created_on'] quiz = models.ForeignKey(Quiz, on_delete=models.CASCADE) question = RichTextUploadingField() explanation = RichTextUploadingField() type = models.CharField(max_length=32, choices=QUESTION_TYPE_CHOICES) option1 = models.CharField(max_length=512, null=True, blank=True) option2 = models.CharField(max_length=512, null=True, blank=True) option3 = models.CharField(max_length=512, null=True, blank=True) option4 = models.CharField(max_length=512, null=True, blank=True) answer = models.CharField( max_length=1024, verbose_name="Answer", help_text="any of the following: T, F, 1, 2, 3, 4 or some text. " "For text answers separate multiple correct choices with '|' (pipe) character." ) created_on = models.DateTimeField(default=timezone.now) @property def options(self): return [self.option1, self.option2, self.option3, self.option4] def is_answer_valid(self) -> bool: if self.type == 'text': return True answer_options = ('T', 'F', '1', '2', '3', '4') if self.answer in answer_options: return True else: return False def is_options_valid(self): if self.type == 'mcq': return any(self.options) else: return not any(self.options) @property def is_valid(self) -> bool: return self.is_answer_valid() and (self.is_options_valid()) def get_absolute_url(self): return reverse('quiz:question', args=[self.id]) def clean(self): if not self.is_answer_valid(): raise ValidationError( f'Answer must any of the following: T, F, 1, 2, 3, 4 or some text, not {self.answer}' ) if not self.is_options_valid(): raise ValidationError( f'Options must be set only for mcq type! not for {self.type} type' ) def save(self, *args, **kwargs): super(Question, self).save(*args, **kwargs) def __str__(self): return f'question_id: {self.id}'
class Entry(models.Model): user = models.ForeignKey(User) title = models.CharField(max_length=250, verbose_name=u'Title') content = RichTextUploadingField()
class Quiz(PaidObjectMixin): """ A quiz object contains metadata about itself and a m2m field to the Question model. For all quizzes we assume that the ordering of the questions is unimportant, hence we can use an unordered m2m to Questions. Through a related_name attr we can also query the database for the quiz(zes) that a question may exist in. """ objects = models.Manager() LEVEL_CHOICES = [(None, ''), ('fluent', 'Fluent/Native Speaker'), ('advanced', 'Advanced'), ('intermediate', 'Intermediate'), ('beginner', 'Beginner'), ('any', 'French Learner of any Level')] class Meta: ordering = [ '-created_on', ] verbose_name = 'Quiz' verbose_name_plural = 'Quizzes' title = models.CharField(max_length=256, verbose_name='Quiz Title') slug = models.SlugField(max_length=256, verbose_name='Slug', blank=True) description = RichTextUploadingField(config_name='minimal') level = models.CharField(max_length=128, verbose_name='French Level', choices=LEVEL_CHOICES) thumbnail = models.ImageField( upload_to='quiz/thumbnails/', null=True, blank=True, default='quiz/thumbnails/quiz-placeholder.jpg') total_time = models.DurationField(verbose_name='Total Time', default=timedelta(minutes=15)) tags = TaggableManager() active = models.BooleanField(verbose_name='Active', default=True) not_for_sale = models.BooleanField(verbose_name='Not For Sale', default=False) created_on = models.DateTimeField(default=timezone.now, verbose_name='Quiz Created On') @property def questions(self): return Question.objects.filter(quiz=self.id) @property def question_id_list(self): return [question.id for question in self.questions] @classmethod def get_recent(cls): return cls.objects.filter(created_on__gte=(timezone.now() - RECENT_TIME_LIMIT)) def get_start_url(self): return reverse('quiz:start', args=[self.slug]) def get_attempt_url(self, quiz_submission): return reverse('quiz:attempt', args=[self.slug, quiz_submission.id]) def get_checked_url(self, quiz_submission): return reverse('quiz:checked', args=[self.slug, quiz_submission.id]) def get_absolute_url(self): return reverse('quiz:buy', args=[self.slug]) def save(self, *args, **kwargs): self.slug = slugify(f"{self.title}-{self.id}") super(Quiz, self).save(*args, **kwargs) def __str__(self): return self.title
class NewsEntry(models.Model): name = models.TextField() icon = models.CharField(max_length=100) description = RichTextUploadingField()
class Competition(models.Model): CHAMPIONSHIP = 1 KNOWLEDGE = 2 category_choice = ((CHAMPIONSHIP, "Championship"), (KNOWLEDGE, "Knowledge")) evaluation_choice = (('AUC', 'Area Under ROC Curve'), ('RMSE', 'Root of Mean Square Error'), ('PRECISION', 'Precision'), ('RECALL', 'Recall'), ('ACCURACY', 'Accuracy'), ('MAP', 'Mean Average Precision'), ('NDCG', 'Normalized Discounted Cumulative Gain'), ('SMP', 'SMP cup 2016'), ('SOHU', 'Sohu Luckydata')) uid = models.CharField(max_length=50, db_index=True, unique=True, null=True) name = models.CharField(max_length=50) name_en = models.CharField(max_length=100, null=True) description = models.TextField(blank=True) description_en = models.TextField(null=True, blank=True) host = models.ForeignKey(User, related_name='host_competitions') category = models.IntegerField(choices=category_choice) award = models.CharField(max_length=10, blank=True) sponsor = models.CharField(max_length=100, blank=True) sponsor_en = models.CharField(max_length=100, blank=True) start_datetime = models.DateTimeField() final_submit_datetime = models.DateTimeField() end_datetime = models.DateTimeField() finalCaculate_datetime = models.DateTimeField(null=True) ShowWinner_datetime = models.DateTimeField(null=True) valid_end_datetime = models.DateTimeField(null=True) winner_start_datetime = models.DateTimeField(null=True) winner_end_datetime = models.DateTimeField(null=True) max_team_size = models.IntegerField(default=10, validators=[ validators.MinValueValidator(1), validators.MaxValueValidator(100) ]) allow_overdue_submission = models.BooleanField() invisible = models.BooleanField(default=False) submit_per_day = models.IntegerField(default=5) final_submit_count = models.IntegerField(default=2) final_showwinners_count = models.IntegerField(default=50) week_winnernum = models.IntegerField(default=1) final_showscore_min = models.FloatField(default=0.5) evaluation = models.CharField(max_length=10, choices=evaluation_choice) evaluate_reverse = models.BooleanField(default=False) num_line = models.IntegerField() final_num_line = models.IntegerField(null=True) public_ratio = models.IntegerField() public_truth = models.FileField(upload_to=truth_file_name, storage=truth_storage) private_truth = models.FileField(upload_to=truth_file_name, storage=truth_storage) filetype = models.CharField(max_length=10, default='csv') introduction = RichTextUploadingField() introduction_en = RichTextUploadingField(null=True) rules = RichTextUploadingField() rules_en = RichTextUploadingField(null=True) data_description = RichTextUploadingField() data_description_en = RichTextUploadingField(null=True) winners = RichTextUploadingField(null=True, blank=True) winners_en = RichTextUploadingField(null=True, blank=True) logo = models.ImageField(upload_to=resource_file_name, blank=True) banner = models.ImageField(upload_to=resource_file_name, blank=True) participants = models.ManyToManyField( User, through='Participation', through_fields=('competition', 'user'), related_name='participate_competitions') def last_refresh_time(self): now = timezone.now() delta = datetime.timedelta(days=(now - self.start_datetime).days) return self.start_datetime + delta def next_refresh_time(self): now = timezone.now() delta = datetime.timedelta(days=(now - self.start_datetime).days + 1) return self.start_datetime + delta def ongoing_days(self): return (timezone.now() - self.start_datetime).days + 1 def is_active(self): return timezone.now() < self.end_datetime and timezone.now( ) >= self.start_datetime def is_over(self): return timezone.now() > self.end_datetime def __str__(self): return self.name @staticmethod def active_competitions(): now = timezone.now() Competition.objects.filter(start_datetime_lte=now, end_datetime_gt=now) def has_participant(self, user): return self.participants.filter(pk=user.pk).exists() def find_team_of_user(self, user): try: team = Participation.objects.filter(user=user, competition=self).get().team return team except ObjectDoesNotExist: return None
class Disclaimer(models.Model): disclaimer_name = models.CharField(max_length=255) # disclaimer_details = models.TextField(default="") disclaimer_details = RichTextUploadingField()
class Post(TimeStampedModel): author = ForeignKey(User, on_delete=SET_NULL, null=True) title = CharField(_("Post Title"), blank=False, null=True, max_length=255) slug = SlugField(unique=True, null=True, blank=True, max_length=500) videos = FileField( _("Upload Video"), upload_to=blog_file_path, null=True, blank=True, validators=[file_validator], ) url = URLField(blank=True, max_length=500, null=True, unique=True) pub_date = DateField( _("Post Published Date"), auto_now=False, auto_now_add=False, null=True, blank=False, ) draft = BooleanField(default=False) featured = BooleanField(default=False) content = RichTextUploadingField() comments = GenericRelation(Comment) added_by = CharField(_("added_by"), max_length=555, null=True, blank=True) categories = ManyToManyField("category.Category", help_text="Categorize this item.") tags = ManyToManyField("category.Tag", help_text="Tag this item.") objects = PostManager() def __str__(self): return self.title @staticmethod def autocomplete_search_fields(): return "title", "author" @property def readtime(self): return str(readtime.of_test(self.content)) @property def get_image_url(self): img = self.image_set.first() if img: return img.image.url return img #None class Meta: managed = True verbose_name = "Post" verbose_name_plural = "Posts" ordering = ["title", "-pub_date"] @property def get_related_posts_by_tags(self): return Post.objects.filter(tags__in=self.tags.all())[:4] # @property # def comments(self): # instance = self # return Comment.objects.filter_by_instance(instance) @property def get_content_type(self): instance = self content_type = ContentType.objects.get_for_model(instance.__class__) return content_type def get_absolute_url(self): return f"/blogs/{self.slug}" def get_update_url(self): return f"{self.get_absolute_url}/update" def get_delete_url(self): return f"{self.get_absolute_url}/delete"
class Terms(models.Model): terms_name = models.CharField(max_length=255) # terms_details = models.TextField(default="") terms_details = RichTextUploadingField()
class Product(models.Model): # Relations category = models.ManyToManyField( 'Category', blank=True, verbose_name=_('categories'), ) related_product = models.ManyToManyField( 'self', blank=True, verbose_name=_('related products'), ) # Attributes active = models.BooleanField(_('active'), default=False) description = RichTextUploadingField( _('description'), blank=True, null=True, ) description2 = models.TextField( _('description2'), blank=True, null=True, ) background_image = models.ImageField( _('background_image'), upload_to='product/%Y/%m/%d', help_text= _("For optimal quality, we recommend that you choose images that are at least 1600px wide" ), ) background_image_cropping = ImageRatioField('background_image', '1600x900') name = models.CharField( _('name'), max_length=120, unique=True, ) slug = models.SlugField( _('slug'), editable=False, unique=True, ) title = models.CharField( _('title'), blank=True, max_length=120, null=True, ) # Meta Data created_on = models.DateTimeField( _('created on'), auto_now_add=True, editable=False, null=True, ) created_by = models.ForeignKey( User, on_delete=models.SET_NULL, null=True, related_name='+', verbose_name=_('created by'), ) updated_on = models.DateTimeField( _('updated on'), auto_now=True, editable=False, null=True, ) updated_by = models.ForeignKey( User, blank=True, on_delete=models.SET_NULL, null=True, related_name='+', verbose_name=_('updated by'), ) # Meta class Meta: ordering = ['name'] verbose_name = _('product') verbose_name_plural = _('products') # Functions def __str__(self): return "%s" % (self.name) def __unicode__(self): return u"%s" % (self.name) def get_absolute_url(self): return reverse('product:product_detail', kwargs={'slug': self.slug}) def background_image_cropping_url(self): if self.background_image: return get_thumbnailer(self.background_image).get_thumbnail({ 'size': (1600, 900), 'box': self.background_image_cropping, 'crop': True, 'detail': True, }).url def image_tag(self): _('image'), if self.background_image: return mark_safe('<img src="%s" height="100" />' % (self.background_image.url)) else: return "%s" % (_('None')) def save(self, *args, **kwargs): super(Product, self).save() self.slug = slugify(self.name) return super(Product, self).save(*args, **kwargs)
class Organizacion(models.Model): # tipo = models.CharField(max_length=20,choices=ESP_ORG_CHOICES) nombre = models.CharField(max_length=255) logo = ImageField(upload_to='logos/', blank=True, null=True, help_text='Las dimenciones de la imagen son 200x200') objetivo = RichTextUploadingField( verbose_name='Descripción de la Organización') contacto_1 = models.CharField(max_length=255, blank=True, null=True, verbose_name='Persona de Contacto 1') correo_1 = models.CharField(max_length=255, blank=True, null=True, verbose_name='Correo 1') telefono_1 = models.CharField(max_length=255, blank=True, null=True, verbose_name='Teléfono 1') contacto_2 = models.CharField(max_length=255, blank=True, null=True, verbose_name='Persona de Contacto 2') correo_2 = models.CharField(max_length=255, blank=True, null=True, verbose_name='Correo 2') telefono_2 = models.CharField(max_length=255, blank=True, null=True, verbose_name='Teléfono 2') pais_sede = models.ForeignKey(Pais, verbose_name='País Sede') ciudad = models.CharField( max_length=255, blank=True, null=True, help_text='Cuidad donde esta ubicada o dirección', verbose_name='Ciudad/Dirección') location = PlainLocationField(based_fields=['ciudad'], zoom=5, blank=True, null=True, verbose_name='Ubicación') tipo_organizacion = models.CharField(max_length=20, choices=TIPO_CHOICES, verbose_name='Tipo de Organización') #tipo_actividad = models.ManyToManyField(TipoActividad,verbose_name='Tipo de Actividad') participacion_cadena = models.ManyToManyField( Participacion, verbose_name='Participación en la Cadena de Valor') servicios = models.ManyToManyField( ServiciosCadena, verbose_name='Servicios que brinda la Organización') ambito_accion = models.CharField(max_length=20, choices=AMBITO_CHOICES, verbose_name='Ámbito de Acción') paises_labora = models.ManyToManyField(Pais, related_name='Paises', verbose_name='Países donde Labora') #cobertura = models.CharField(max_length=255,verbose_name='Cobertura Geográfica') # periodo_permanencia = models.CharField(max_length=20,choices=PERIODO_CHOICES,verbose_name='Período de Permanencia') # intercambio = models.ManyToManyField(IntercambioTecnologia,verbose_name='Intercambio de Tecnología') sitio_web = models.URLField(blank=True, null=True) miembros = models.IntegerField(blank=True, null=True, verbose_name='N° de Miembros/Socio') # tamano = models.CharField(max_length=20,blank=True,null=True,verbose_name='Tamaño') actualizado = models.DateField(editable=False, auto_now=True) slug = models.SlugField(editable=False, max_length=450) ratings = GenericRelation(Rating, related_query_name='object_list') usuario = models.ManyToManyField(User, blank=True) def save(self, *args, **kwargs): # if not self.id: self.slug = slugify(self.nombre) super(Organizacion, self).save(*args, **kwargs) def __str__(self): return self.nombre class Meta: verbose_name = 'Organización/Especialista' verbose_name_plural = 'Organizaciones/Especialistas' ordering = ['-id']
class Blog(models.Model): title = models.CharField( max_length=50, validators=[blog_title_validator], help_text="This is the title of your blog. (limit to 50 characters)") author = models.ForeignKey(to=User, on_delete=models.SET_NULL, null=True) create_date = models.DateTimeField(verbose_name='Date Published', auto_now_add=True, editable=False) upvotes = models.PositiveIntegerField(verbose_name="Upvotes", editable=False, default=0) downvotes = models.PositiveIntegerField(verbose_name="Downvotes", editable=False, default=0) short_description = models.TextField( blank=True, null=True, max_length=500, help_text= "This is the short description that appears in blog list. (Limit to 500 characters)" ) # TODO Put relevant maxlength limit here body = RichTextUploadingField( blank=True, null=True, help_text= "This is the main content of the blog. You can style the content , put images, videos, code-snippets and a lot more things directly into the editor" ) picture = models.ImageField( blank=False, upload_to=get_blog_image_upload_path, help_text="This picture is the cover image of your blog.") slug = models.SlugField( max_length=60, null=True, blank=True, help_text= "This slug will form the url of your blog. The Url will be blogs/blog/<your username>/<slug>" ) tags = models.ManyToManyField( to=Tag, blank=True, help_text= "Please select one or more tags for your blog or create a new tag") views = models.PositiveIntegerField(verbose_name="Views", default=0, editable=False) disqus_identifier = models.BigIntegerField(editable=False, default=0) # TODO Improve the procedure of counting views (See the blog detail view) class Meta: ordering = ['-create_date'] unique_together = ['slug', 'author'] def __str__(self): return str(self.title) + ' : by ' + str(self.author) def was_published_recently(self): return self.create_date >= timezone.now() - datetime.timedelta( minutes=1) # TODO Change this to relevant time duration def recount_upvotes(self): self.upvotes = self.vote_set.filter(upvote_downvote=1).count() self.save() def recount_downvotes(self): self.downvotes = self.vote_set.filter(upvote_downvote=-1).count() self.save() def recount_votes(self): self.recount_upvotes() self.recount_downvotes() # TODO Set Cron Job to call recount periodically def upvote(self, user): vote = Vote(voter=user, blog=self, upvote_downvote=1) vote.save() self.upvotes += 1 self.save() def unupvote(self, user): vote = Vote(voter=user, blog=self, upvote_downvote=0) vote.save() self.upvotes -= 1 self.save() def downvote(self, user): vote = Vote(voter=user, blog=self, upvote_downvote=-1) vote.save() self.downvotes += 1 self.save() def undownvote(self, user): vote = Vote(voter=user, blog=self, upvote_downvote=0) vote.save() self.downvotes -= 1 self.save() def save(self, *args, **kwargs): try: super().save() except IntegrityError: raise ValidationError( "You have another blog with either same title or same slug. Please change title of this blog" ) if self.disqus_identifier == 0: self.disqus_identifier = 16 * (int(self.id) + 1024) if str(self.slug) == "None": self.slug = self.title.lower().replace(' ', '-') super().save()
class Post(models.Model): author = models.ForeignKey(User, on_delete=models.CASCADE, related_name='blog_author') published_date = models.DateTimeField() title = models.CharField(max_length=200, help_text='Title of the post.') body = RichTextUploadingField() description = models.CharField(max_length=100, help_text='A short tagline that describes what the reader will be reading about.') category = models.ManyToManyField(Category, help_text='The category that the post will be listed under.') is_published = models.BooleanField(default=True, help_text='Do you want this post to be published publicly?') slug = models.SlugField(unique=True) def get_absolute_url(self): return reverse('blog_post_page', kwargs={'slug': self.slug}) def __str__(self): return self.title def get_categories_formatted_sidebar(): """ Get the categories and format them for display on the sidebar """ categories = [] cats = {} # sort through all categories and add them to a dictionary for tmp in Category.objects.all(): count = tmp.post_set.filter(is_published=True).count() if count >= 1: cats.update({tmp:count}) # sort the dictionary by value cats = dict(sorted(cats.items(), key=operator.itemgetter(1),reverse=True)) # create the html format for the sidebar categories.append('<h3>Categories</h3><ul class="pl-2">') for k,v in cats.items(): categories.append('<li class="list-unstyled"><a href="'+k.get_absolute_url()+'">'+k.title+'</a> <span>('+str(v)+')</span></li>') categories.append('</ul>') return ''.join(categories) def get_categories_formatted_post(self): """ Get the categories and format them for display """ categories = [] for tmp in self.category.all(): categories.append(prefix_char+'<a href="'+tmp.get_absolute_url()+'">'+tmp.title+'</a>'+suffix_char) categories.sort() # sort the categories to be alphabetical order return ''.join(categories) def get_posts_formatted(): """ Get the posts and format them for display """ queried_posts = get_formatted_data(Post.objects.filter(is_published=True).order_by('-published_date')) formatted_posts = [] for year,posts in queried_posts.items(): formatted_posts.append('<h3>'+str(year)+'</h3>') formatted_posts.append('<ul class="post-list mb-5">') for count, post in enumerate(posts, 1): formatted_posts.append('<li'+(' class="bg-white"' if count % 2 else '')+'>'+post.get_categories_formatted_post()+' <span title="'+str(post.published_date)+'">'+str(post.published_date.strftime('%b %d'))+'</span><a href="'+post.get_absolute_url()+'">'+post.title+'</a></li>') formatted_posts.append('</ul>') return ''.join(formatted_posts) def categories(self): return ", ".join([str(p.title) for p in self.category.all()]) class Meta: db_table = 'blog_post' ordering = ['-published_date'] verbose_name = 'Post' verbose_name_plural = 'Posts'
class Cause(TimeStampedModel): author = ForeignKey(User, on_delete=SET_NULL, null=True) title = CharField(_("Cause Title"), blank=False, null=True, max_length=255) slug = SlugField(unique=True, null=True, blank=True, max_length=500) image = ResizedImageField(_("Upload Cause Image"), quality=75, force_format='JPEG', size=[1920, 1148], crop=['middle', 'center'], upload_to=cause_file_path, null=True, blank=True) pub_date = DateField( _("Post Published Date"), auto_now=False, auto_now_add=False, null=True, blank=False, ) end_date = DateField( _("End Published Date"), auto_now=False, auto_now_add=False, null=True, blank=False, ) tt_amount = DecimalField(max_digits=20, decimal_places=2, null=True, blank=True, default=0.00) donate = DecimalField(max_digits=20, decimal_places=2, null=True, blank=True, default=0.00) max_donation = DecimalField(max_digits=20, decimal_places=2, null=True, blank=True, default=100000.00) draft = BooleanField(default=False) featured = BooleanField(default=False) comments = GenericRelation(Comment) content = RichTextUploadingField() added_by = CharField(_("added_by"), max_length=255, null=True, blank=True) categories = ManyToManyField("category.Category", help_text="Categorize this item.") tags = ManyToManyField("category.Tag", help_text="Tag this item.") objects = CauseManager() def __str__(self): return self.title @property def get_related_causes_by_tags(self): return Cause.objects.filter(tags__in=self.tags.all())[0:4] @property def readtime(self): return str(readtime.of_test(self.content)) @staticmethod def autocomplete_search_fields(): return "title", "author.title" @property def avg(self): dec = self.tt_amount / self.max_donation avg = dec * 100 return avg def save(self, *args, **kwargs): if self.max_donation > self.tt_amount: self.tt_amount = self.tt_amount + self.donate else: self.draft = True self.featured = False super().save(*args, **kwargs) class Meta: managed = True verbose_name = "Cause" verbose_name_plural = "Causes" ordering = ["title", "-end_date"] def get_absolute_url(self): return f"/cause/{self.slug}" def get_update_url(self): return f"{self.get_absolute_url}/update" def get_delete_url(self): return f"{self.get_absolute_url}/delete"
class Blog(Post): class Meta: ordering = ('-created', ) short_body = models.TextField(verbose_name='Анонс', blank=True) body = RichTextUploadingField(verbose_name='Содержимое', blank=True) image = ImageField(verbose_name='Изображение', upload_to='blog', blank=True, null=True, max_length=300) category = TreeManyToManyField(Category, verbose_name='Категория', db_index=True) objects = super_models.PostManager() rate_type = 'votes' # can_be_rated = True def type_str(self): return 'Запись блога' @property def thumb110(self): try: return get_thumbnail( self.image, '110x200', quality=settings.DEFAULT_THUMBNAIL_QUALITY).url except: return '' @property def thumb150(self): try: return get_thumbnail( self.image, '150x300', quality=settings.DEFAULT_THUMBNAIL_QUALITY).url except: return '' @property def thumb220(self): try: return get_thumbnail( self.image, '220x400', quality=settings.DEFAULT_THUMBNAIL_QUALITY).url except: return '' @property def thumb360(self): try: return get_thumbnail( self.image, '360x720', quality=settings.DEFAULT_THUMBNAIL_QUALITY).url except: return '' @property def anons(self): if self.short_body: return self.short_body else: return helper.cut_text(strip_tags(self.body), 200) @cached_property def mark(self): try: mark = History.objects.filter( post=self, history_type=super_models.HISTORY_TYPE_POST_RATED, deleted=False).aggregate(Count('pk'))['pk__count'] if mark is None: mark = 0 except: mark = 0 return mark
class Courses(models.Model): instructor_id = models.ForeignKey(User, on_delete=models.CASCADE) course_id = models.CharField(unique=True, blank=True, max_length=10) title = models.CharField('Course Title', max_length=200, null=True, blank=True) price = models.DecimalField(max_digits=20, decimal_places=2, null=True, blank=True) course_short_description = models.TextField('Course details', max_length=200, null=True, blank=True) course_long_description = RichTextUploadingField() will_learn = RichTextField() course_image = models.FileField( upload_to=upload_image_path, default='assets/default_images/no-image.png') course_intro_video = models.FileField(upload_to=upload_image_path, max_length=500, null=True, blank=True) course_intro_video_duration = models.CharField(max_length=20, null=20, blank=True) course_complete_duration = models.CharField('Duration', max_length=10) course_for = models.CharField(choices=CourseFor, max_length=20, default='Select For') category = models.ForeignKey(Category, on_delete=models.CASCADE) subcategory = models.ForeignKey(Subcategory, on_delete=models.CASCADE) file = models.FileField(upload_to=upload_image_path, null=True, blank=True) active = models.BooleanField(default=True) featured = models.BooleanField(default=False) locked = models.BooleanField(default=True) created_at = models.DateTimeField(auto_now_add=timezone.now) update_time = models.DateTimeField(auto_now=timezone.now) slug = models.SlugField(blank=True, unique=True) objects = CoursesManager() # class Meta: # ordering = ['-created_at'] def __str__(self): return self.title def get_absolute_url(self): return reverse('course-detail', kwargs={"slug": self.slug}) def get_absolute_authenticated_user_url(self): return reverse('authenticated-courses-detail', kwargs={"slug": self.slug}) def get_absolute_update_url(self): return reverse("update-courses", kwargs={"slug": self.slug}) def get_absolute_delete_url(self): return reverse("delete-courses", kwargs={"slug": self.slug})
class Post(models.Model): title = models.CharField(max_length=50, verbose_name='文章标题') excerpt = models.CharField(max_length=200, verbose_name='文章摘要') content = RichTextUploadingField(verbose_name='文章内容') click_count = models.PositiveIntegerField(default=0, verbose_name='点击次数') is_recommended = models.BooleanField(default=False, verbose_name='是否推荐') date_created = models.DateTimeField(auto_now_add=True, verbose_name='发布时间') date_modified = models.DateTimeField(auto_now=True, verbose_name='修改时间') author = models.ForeignKey(User, on_delete=models.CASCADE,verbose_name='作者') category = models.ForeignKey(Category, on_delete=models.CASCADE,verbose_name='分类') tag = models.ManyToManyField(Tag, verbose_name='标签') cover = ProcessedImageField(upload_to='cover', default='', verbose_name='封面', processors=[ResizeToFill(160, 120)], format='JPEG', options={"quality": 60}) favours = GenericRelation(Favour, related_query_name='posts') class Meta: verbose_name = '文章' verbose_name_plural = verbose_name ordering = ['-date_created'] def __str__(self): return self.title def favour_count(self, update=0): key = 'post_{}_favour_count'.format(self.id) count = cache.get(key) if count is None: count = self.favours.filter(liked=True).count() cache.set(key, count, timeout=300) elif update: count += update cache.set(key, count, timeout=300) return count def click_increase(self): self.click_count += 1 self.save(update_fields=['click_count']) def get_absolute_url(self): return reverse('blog:detail', kwargs={'pk': self.pk}) def to_comments_html(self): key = 'post_{}_comments'.format(self.id) html = '' comments = self.comment_set.all().order_by('-submit_date')[:15] for comment in comments: comment_html = comment.to_html() html += comment_html cache.set(key, html, timeout=300) return html def comment_user_count(self): key = "post_{}_comments_user_num".format(self.id) user_num = cache.get(key, None) if not user_num: user_list = [] key1 = "post_{}_comments_user".format(self.id) for comment in self.comment_set.all(): if not comment.user in user_list: user_list.append(comment.user) user_num = len(user_list) cache.set(key, user_num, timeout=300) cache.set(key1, user_list, timeout=300) return user_num def comment_count(self): key = "post_{}_comments_num".format(self.id) comment_num = cache.get(key, None) if not comment_num: comment_num = self.comment_set.all().count() cache.set(key, comment_num, timeout=300) return comment_num def comment_update(self, new_comment): comment_list_html = self.to_comments_html() key2 = "post_{}_comments_user".format(self.id) key3 = "post_{}_comments_user_num".format(self.id) user_list = cache.get(key2, None) if user_list: if not new_comment.user in user_list: user_list.append(new_comment.user) user_num = len(user_list) cache.set(key3, user_num, timeout=300) cache.set(key2, user_list, timeout=300) else: user_num = self.comment_user_count() key4 = "post_{}_comments_num".format(self.id) comment_num = cache.get(key4, None) if comment_num: comment_num += 1 cache.set(key4, comment_num, timeout=300) else: comment_num = self.comment_count() return comment_list_html, user_num, comment_num
class Careinstructions(models.Model): cares_name = models.CharField(max_length=255) # cares_details = models.TextField(default="") cares_details = RichTextUploadingField()
class Product(models.Model): def get_populate_from(self): return defaultfilters.slugify(unidecode(self.name)) def get_slugify(value): return value.replace(' ', '-') name = models.CharField( max_length=120, verbose_name=_('Product name'), ) category = TreeForeignKey( Category, verbose_name=_('Category'), ) brand = models.ForeignKey( Brands, verbose_name=_('Brand'), ) description = RichTextUploadingField( blank=True, null=True, verbose_name=_('Description'), ) owner = models.ForeignKey( settings.AUTH_USER_MODEL, verbose_name=_('Product Owner'), related_name='products', ) created_at = models.DateField(auto_now_add=True) available_in_stock = models.BooleanField( default=True, verbose_name=_('Available in stock')) is_recommended = models.BooleanField(default=False) price = models.DecimalField( default=Decimal(1), decimal_places=2, max_digits=10, verbose_name=_('Price'), ) is_sale = models.BooleanField(default=False) quantity = models.IntegerField(verbose_name=_('Quantity')) slug = AutoSlugField( populate_from=get_populate_from, unique_with=['owner__first_name', 'created_at'], slugify=get_slugify, always_update=True, null=True, ) colors = models.ManyToManyField(Color, blank=True) sizes = models.ManyToManyField(Size, blank=True) def __str__(self): return "{}".format(self.name) def get_default_image(self): return self.images.first() def get_all_images(self): return self.images.all() def get_price(self): currency = _('soum') return "{} {}".format(intcomma(int(self.price)), currency) def get_reviews(self): return self.product_reviews.filter(is_approved=True) def get_absolute_url(self): return reverse('products:product_detail', args=[self.category.slug, self.slug]) @property def get_related_products(self): return Product.objects.filter(category_id=self.category.id) def get_sale_price(self): try: sale = Sale.objects.first() sale_percent = sale.percent except Sale.DoesNotExist: sale_percent = 1 sale_price = self.price * sale_percent / 100 return self.price - sale_price class Meta: verbose_name = _('Product') verbose_name_plural = _('Products')
class Privacypolicy(models.Model): privacypolicy_name = models.CharField(max_length=255) # privacypolicy_details = models.TextField(default="") privacypolicy_details = RichTextUploadingField()
class Ownercamper(models.Model): ownercamper = RichTextUploadingField() ownercaravan = RichTextUploadingField() def __str__(self): return self.ownercamper
class Article(ModelMeta, models.Model): article_title = models.CharField('title', max_length=150) description = models.CharField('description', blank=True, max_length=160) keywords = models.CharField('keywords', blank=True, max_length=100) article_text = RichTextUploadingField('post text') author = models.ForeignKey(User, verbose_name="author", default=1, on_delete=models.CASCADE) article_section = models.ForeignKey(Section, on_delete=models.CASCADE, blank=True, default=1) slug = models.SlugField(max_length=200, blank=True, unique=True) pub_date = models.DateTimeField('public date', auto_now_add=True) cover = models.ImageField(upload_to='images/', blank=True, default='images/noimage.png') tags = models.ManyToManyField('Tag', blank=True, related_name='articles') comments = models.ManyToManyField('Comment', blank=True, related_name='comment_article') # context_object_name = 'articles' votes = GenericRelation(LikeDislike, related_query_name='articles') thumbnail = ImageSpecField(source='cover', processors=[ResizeToFill(270, 180)], format='JPEG', options={'quality': 60}) class Media: js = [ '/static/ckeditor/ckeditor-init.js', ] class Meta: verbose_name = "Статья" verbose_name_plural = "Статьи" ordering = ['-pub_date'] _metadata = { 'title': 'article_title', 'description': 'description', 'keywords': 'keywords', 'cover': 'get_meta_image' } def get_meta_image(self): if self.cover: return self.cover.url def get_absolute_url(self): return reverse('articles:post_detail_url', kwargs={'slug': self.slug}) def get_update_url(self): return reverse('articles:post_update_url', kwargs={'slug': self.slug}) def get_delete_url(self): return reverse('articles:post_delete_url', kwargs={'slug': self.slug}) def post_delete_url(self): return reverse('articles:post_delete_url', kwargs={'slug': self.slug}) def was_published_recently(self): return self.pub_date >= (timezone.now() - datetime.timedelta(days=7)) def save(self, *args, **kwargs): if not self.id: self.slug = gen_slug(self.article_title) super().save(*args, **kwargs) def __str__(self): return self.article_title