class WaterQuality(AuthUserDetail, CreateUpdateTime): """ Water quality model """ record_date = models.DateTimeField(unique=True, default=datetime.now) julian_day = models.SmallIntegerField() day_frac = models.DecimalField(max_digits=7, decimal_places=3, default=Decimal('0.0'), verbose_name='Fraction of Day') temperature = models.DecimalField(max_digits=5, decimal_places=2, blank=True, null=True, default=Decimal('0.0'), verbose_name='FTemperature (°C)') ph_units = models.DecimalField(max_digits=5, decimal_places=2, blank=True, null=True, default=Decimal('0.0')) stream_depth = models.DecimalField(max_digits=5, decimal_places=2, blank=True, null=True, default=Decimal('0.0')) sp_cond = models.DecimalField(max_digits=6, decimal_places=2, blank=True, null=True, default=Decimal('0.0'), verbose_name='Specific Conductance (uS/cm)') turbidity_ntu = models.DecimalField(max_digits=8, decimal_places=2, blank=True, null=True, default=Decimal('0.0')) ph_mv = models.DecimalField(max_digits=7, decimal_places=2, blank=True, null=True, default=Decimal('0.0')) salinity_ps = models.DecimalField(max_digits=5, decimal_places=2, blank=True, null=True, default=Decimal('0.0'), verbose_name='Potential Soil Salinity') comment = models.TextField(blank=True, null=True) def __unicode__(self): str_format = '{0}'.format(self.record_date) return str_format def __str__(self): str_format = '{0}'.format(self.record_date) return str_format class Meta: ordering = ['-time_created', '-last_update'] verbose_name_plural = 'Water Quality'
class UserProfile(models.Model): """ 用户表 """ gender_choices = ((1, u'男'), (2, u'女')) building_choices = ((1, u'东照大厦1'), (2, u'东照大厦2')) floor_choices = ( (1, u'一楼'), (2, u'二楼'), (3, u'三楼'), (4, u'四楼'), ) role_choices = ( (1, u'法人'), (2, u'财务'), (3, u'行政'), (4, u'其他'), ) dpt_choices = ( (1, u'法人'), (2, u'财务'), (3, u'行政'), (4, u'其他'), ) uid = models.CharField(max_length=64, verbose_name='UID', null=True, blank=True) building = models.SmallIntegerField(choices=building_choices, default=1, verbose_name='大厦') floor = models.SmallIntegerField(choices=floor_choices, default=1, verbose_name='楼层') room = models.IntegerField(verbose_name='房号') company = models.CharField(max_length=64, verbose_name='公司名称') username = models.CharField(max_length=32, verbose_name='用户名') role = models.SmallIntegerField(choices=role_choices, default=1, verbose_name='所属角色') phone = models.CharField(max_length=32, verbose_name='手机') is_superuser = models.BooleanField(default=False, verbose_name='认证') createtime = models.DateTimeField(auto_now_add=True) department = models.SmallIntegerField(choices=dpt_choices, verbose_name='所属部门', null=True, blank=True) email = models.EmailField(max_length=32, verbose_name='邮件', null=True, blank=True) age = models.PositiveIntegerField(verbose_name='年龄', null=True, blank=True) gender = models.SmallIntegerField(choices=gender_choices, null=True, blank=True, verbose_name='性别') class Meta: verbose_name = '用户表' verbose_name_plural = '用户表' def __str__(self): return self.username
class Migration(migrations.Migration): initial = True dependencies = [ migrations.swappable_dependency(settings.AUTH_USER_MODEL), ('course', '0003_auto_20200717_0919'), ] operations = [ migrations.CreateModel( name='Order', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('is_show', models.BooleanField(default=False, verbose_name='是否显示')), ('orders', models.IntegerField(default=1, verbose_name='图片排序')), ('is_delete', models.BooleanField(default=False, verbose_name='是否删除')), ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), ('update_time', models.DateTimeField(auto_now=True, verbose_name='修改时间')), ('order_title', models.CharField(max_length=150, verbose_name='订单标题')), ('total_price', models.DecimalField(decimal_places=2, default=0, max_digits=6, verbose_name='订单总价')), ('real_price', models.DecimalField(decimal_places=2, default=0, max_digits=6, verbose_name='实付金额')), ('order_number', models.CharField(max_length=64, verbose_name='订单号')), ('order_status', models.SmallIntegerField(choices=[(0, '未支付'), (1, '已支付'), (2, '已取消'), (3, '超时取消')], default=0, verbose_name='订单状态')), ('pay_type', models.SmallIntegerField(choices=[(1, '支付宝'), (2, '微信支付')], default=1, verbose_name='支付方式')), ('credit', models.IntegerField(default=0, verbose_name='使用的积分数量')), ('coupon', models.IntegerField(null=True, verbose_name='用户优惠券ID')), ('order_desc', models.TextField(max_length=500, verbose_name='订单描述')), ('pay_time', models.DateTimeField(null=True, verbose_name='支付时间')), ('user', models.ForeignKey( on_delete=django.db.models.deletion.DO_NOTHING, related_name='user_orders', to=settings.AUTH_USER_MODEL, verbose_name='下单用户')), ], options={ 'verbose_name': '订单记录', 'verbose_name_plural': '订单记录', 'db_table': 'bz_order', }, ), migrations.CreateModel( name='OrderDetail', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('is_show', models.BooleanField(default=False, verbose_name='是否显示')), ('orders', models.IntegerField(default=1, verbose_name='图片排序')), ('is_delete', models.BooleanField(default=False, verbose_name='是否删除')), ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), ('update_time', models.DateTimeField(auto_now=True, verbose_name='修改时间')), ('expire', models.IntegerField(default='0', help_text='0表示永久有效', verbose_name='有效期周期')), ('price', models.DecimalField(decimal_places=2, max_digits=6, verbose_name='课程原价')), ('real_price', models.DecimalField(decimal_places=2, max_digits=6, verbose_name='课程实价')), ('discount_name', models.CharField(default='', max_length=120, verbose_name='优惠类型')), ('course', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='course_orders', to='course.Course', verbose_name='课程ID')), ('order', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='order_courses', to='order.Order', verbose_name='订单ID')), ], options={ 'verbose_name': '订单详情', 'verbose_name_plural': '订单详情', 'db_table': 'bz_order_detail', }, ), ]
class Method(models.Model): name = models.CharField(max_length=20, primary_key=True) # bit to store different types. e.g 5 = 0b101 = 1 << NUMERIC | 1 << DM; 4 = 0b100 = 1 << NUMERIC type = models.SmallIntegerField()
class Redirect(models.Model): """A HTTP redirect associated with a Project.""" project = models.ForeignKey(Project, verbose_name=_('Project'), related_name='redirects') redirect_type = models.CharField(_('Redirect Type'), max_length=255, choices=TYPE_CHOICES, help_text=redirect_type_helptext) from_url = models.CharField(_('From URL'), max_length=255, db_index=True, help_text=from_url_helptext, blank=True) to_url = models.CharField(_('To URL'), max_length=255, db_index=True, help_text=to_url_helptext, blank=True) http_status = models.SmallIntegerField(_('HTTP Status'), choices=HTTP_STATUS_CHOICES, default=301) status = models.BooleanField(choices=STATUS_CHOICES, default=True) create_dt = models.DateTimeField(auto_now_add=True) update_dt = models.DateTimeField(auto_now=True) objects = RedirectManager() class Meta: verbose_name = _('redirect') verbose_name_plural = _('redirects') ordering = ('-update_dt', ) def __unicode__(self): if self.redirect_type == 'prefix': return ugettext('Prefix Redirect: %s ->' % self.from_url) elif self.redirect_type == 'page': return ugettext('Page Redirect: %s -> %s' % (self.from_url, self.to_url)) else: return ugettext('Redirect: %s' % self.get_redirect_type_display()) def get_full_path(self, filename, language=None, version_slug=None): """ Return a full path for a given filename. This will include version and language information. No protocol/domain is returned. """ # Handle explicit http redirects if re.match('^https?://', filename): return filename return resolve_path(project=self.project, language=language, version_slug=version_slug, filename=filename) def get_redirect_path(self, path, language=None, version_slug=None): method = getattr(self, 'redirect_{type}'.format(type=self.redirect_type)) return method(path, language=language, version_slug=version_slug) def redirect_prefix(self, path, language=None, version_slug=None): if path.startswith(self.from_url): log.debug('Redirecting %s', self) cut_path = re.sub('^%s' % self.from_url, '', path) to = self.get_full_path(filename=cut_path, language=language, version_slug=version_slug) return to def redirect_page(self, path, language=None, version_slug=None): if path == self.from_url: log.debug('Redirecting %s', self) to = self.get_full_path(filename=self.to_url.lstrip('/'), language=language, version_slug=version_slug) return to def redirect_exact(self, path, **__): if path == self.from_url: log.debug('Redirecting %s', self) return self.to_url # Handle full sub-level redirects if '$rest' in self.from_url: match = self.from_url.split('$rest')[0] if path.startswith(match): cut_path = re.sub('^%s' % match, self.to_url, path) return cut_path def redirect_sphinx_html(self, path, language=None, version_slug=None): for ending in ['/', '/index.html']: if path.endswith(ending): log.debug('Redirecting %s', self) path = path[1:] # Strip leading slash. to = re.sub(ending + '$', '.html', path) return self.get_full_path(filename=to, language=language, version_slug=version_slug) def redirect_sphinx_htmldir(self, path, language=None, version_slug=None): if path.endswith('.html'): log.debug('Redirecting %s', self) path = path[1:] # Strip leading slash. to = re.sub('.html$', '/', path) return self.get_full_path(filename=to, language=language, version_slug=version_slug)
class Request(models.Model): # Response infomation response = models.SmallIntegerField(_('response'), choices=HTTP_STATUS_CODES, default=200) # Request infomation method = models.CharField(_('method'), default='GET', max_length=7) path = models.CharField(_('path'), max_length=255) time = models.DateTimeField(_('time'), default=timezone.now, db_index=True) is_secure = models.BooleanField(_('is secure'), default=False) is_ajax = models.BooleanField( _('is ajax'), default=False, help_text=_('Wheather this request was used via javascript.'), ) # User infomation ip = models.GenericIPAddressField(_('ip address')) user = models.ForeignKey(AUTH_USER_MODEL, blank=True, null=True, verbose_name=_('user')) client = models.ForeignKey(OAUTH_CLIENT_MODEL, blank=True, null=True, verbose_name=_('client')) referer = models.URLField(_('referer'), max_length=255, blank=True, null=True) user_agent = models.CharField(_('user agent'), max_length=255, blank=True, null=True) language = models.CharField(_('language'), max_length=255, blank=True, null=True) objects = RequestManager() class Meta: app_label = 'request' verbose_name = _('request') verbose_name_plural = _('requests') ordering = ('-time',) def __str__(self): return '[%s] %s %s %s' % (self.time, self.method, self.path, self.response) def get_user(self): return get_user_model().objects.get(pk=self.user_id) def from_http_request(self, request, response=None, commit=True): # Request infomation self.method = request.method self.path = request.path[:255] self.is_secure = request.is_secure() self.is_ajax = request.is_ajax() # User infomation self.ip = request.META.get('REMOTE_ADDR', '') self.referer = request.META.get('HTTP_REFERER', '')[:255] self.user_agent = request.META.get('HTTP_USER_AGENT', '')[:255] self.language = request.META.get('HTTP_ACCEPT_LANGUAGE', '')[:255] if hasattr(request, 'user'): if request.user.is_authenticated(): self.user = request.user if hasattr(request, 'auth_client'): self.client = request.auth_client if response: self.response = response.status_code if (response.status_code == 301) or (response.status_code == 302): self.redirect = response['Location'] if commit: self.save() @property def browser(self): if not self.user_agent: return if not hasattr(self, '_browser'): self._browser = browsers.resolve(self.user_agent) return self._browser[0] @property def keywords(self): if not self.referer: return if not hasattr(self, '_keywords'): self._keywords = engines.resolve(self.referer) if self._keywords: return ' '.join(self._keywords[1]['keywords'].split('+')) @property def hostname(self): try: return gethostbyaddr(self.ip)[0] except Exception: # socket.gaierror, socket.herror, etc return self.ip def save(self, *args, **kwargs): if not request_settings.LOG_IP: self.ip = request_settings.IP_DUMMY elif request_settings.ANONYMOUS_IP: parts = self.ip.split('.')[0:-1] parts.append('1') self.ip = '.'.join(parts) if not request_settings.LOG_USER: self.user = None super(Request, self).save(*args, **kwargs)
class Migration(migrations.Migration): dependencies = [ ('dynadb', '0023_auto_20160725_1724'), ] operations = [ migrations.AlterField( model_name='dyndbreferences', name='authors', field=models.CharField( blank=True, help_text='List of the authors separated by semicolon.', max_length=60, null=True, verbose_name='Authors'), ), migrations.AlterField( model_name='dyndbreferences', name='doi', field=models.CharField(blank=True, help_text='Digital object identifier.', max_length=80, null=True, unique=False, verbose_name='DOI'), ), migrations.AlterField( model_name='dyndbreferences', name='issue', field=models.CharField(blank=True, help_text='Issue number.', max_length=10, null=True, verbose_name='Issue'), ), migrations.AlterField( model_name='dyndbreferences', name='journal_press', field=models.CharField( blank=True, help_text='Name of the Journal or Press in case of a book.', max_length=60, null=True, verbose_name='Journal or Press'), ), migrations.AlterField( model_name='dyndbreferences', name='pages', field=models.CharField( blank=True, help_text= 'Initial and final pages of the publication separated by dash.', max_length=16, null=True, verbose_name='Pages'), ), migrations.AlterField( model_name='dyndbreferences', name='pmid', field=models.IntegerField( blank=True, help_text='PubMed identifier or PubMed unique identifier', null=True, unique=True, verbose_name='PMID'), ), migrations.AlterField( model_name='dyndbreferences', name='pub_year', field=models.SmallIntegerField(blank=True, help_text='Year of publication', null=True, verbose_name='Publication year'), ), migrations.AlterField( model_name='dyndbreferences', name='title', field=models.CharField(blank=True, help_text='Title of the paper.', max_length=100, null=True, verbose_name='Title'), ), migrations.AlterField( model_name='dyndbreferences', name='url', field=models.CharField( blank=True, help_text= 'Uniform Resource Locator to the publication resource', max_length=100, null=True, verbose_name='URL'), ), migrations.AlterField( model_name='dyndbreferences', name='volume', field=models.CharField(blank=True, help_text='Volume number.', max_length=10, null=True, verbose_name='Volume'), ), ]
class Profile(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='profile') avatar = models.ImageField(null=True, blank=True, upload_to='appaccounts/images/profiles/', verbose_name='Аватар') description = models.TextField(max_length=1000, null=True, blank=True, verbose_name='О себе') created = models.DateTimeField(auto_now_add=True, null=True) score = models.IntegerField(null=True, blank=True, verbose_name='Баллы') index_avatar = models.SmallIntegerField(null=True, blank=True, verbose_name='Индекс аватара') need_password = models.BooleanField(null=True, default=False, verbose_name='Нужен пароль') def __str__(self): return self.user.username def get_absolute_url(self): return reverse('appaccounts:profile_edit') def get_name(self): if self.user.first_name: return self.user.first_name else: return self.user.username def get_avatar_url(self): if self.index_avatar and 0 < self.index_avatar <= 12: return settings.STATIC_URL + f'images/ico/people/student_avatars/student_avatar{self.index_avatar}.svg' if self.avatar: return self.avatar.url else: # return settings.STATIC_URL + 'images/ico/people/user_black.svg' return settings.STATIC_URL + 'images/ico/people/student1.svg' def get_avatar_white_url(self): if self.avatar: return self.avatar.url else: return settings.STATIC_URL + 'images/ico/people/student_white.svg' def get_description(self): if self.description: return self.description else: return 'Пользователь пока ничего не написал о себе' def get_profile_data(self, fields=None): profile_data_all = { 'profile_id': self.id, 'profile_name': self.user.username, 'profile_description': self.description, 'profile_avatar': self.avatar.url if self.avatar else '', 'profile_url': self.get_absolute_url(), } if fields: profile_data = {} for field in fields: profile_data[field] = profile_data_all[field] return profile_data else: return profile_data_all def get_user_skills_data(self, user=None): from apptasks.models import Task, Skill from apporders.models import Order import json request_user = self.user if not user else user # формируем список оценок только по тем скилам, по которым у юзера есть решенные задачи user_order_list = Order.objects.select_related('task__skill').filter( user=request_user) user_skills = [] for user_order in user_order_list: order_rate = round(user_order.get_rate()['rate'], 1) try: skill = next(item for item in user_skills if item["skill"] == user_order.task.skill) skill['rate'] += order_rate skill['task_count'] += 1 except: order_data = { 'skill': user_order.task.skill, 'rate': order_rate, 'task_count': 1 } user_skills.append(order_data) extra_skill_count = user_order.task.get_extra_skill_count() if extra_skill_count: extra_order_rate = round(order_rate * 30 / 100, 1) extra_skill_list = (user_order.task.extra_skill1, user_order.task.extra_skill2, user_order.task.extra_skill3) for extra_skill in extra_skill_list: if extra_skill: try: skill = next(item for item in user_skills if item["skill"] == extra_skill) skill['rate'] += extra_order_rate skill['task_count'] += 1 except: order_data = { 'skill': extra_skill, 'rate': extra_order_rate, 'task_count': 1 } user_skills.append(order_data) # формируем список всех скилов, которые есть в системе # и по каждому добавляем оценку юзера skill_list = Skill.objects.all() user_skills_data = [] user_total_rate = 0 user_total_task_count = 0 for skill in skill_list: skill_data = {'skill': str(skill), 'rate': 0} try: user_skill = next(item for item in user_skills if item["skill"] == skill) skill_data['rate'] += user_skill['rate'] user_total_rate += user_skill['rate'] user_total_task_count += user_skill['task_count'] except: skill_data['rate'] = 0 user_skills_data.append(skill_data) data = { 'total_task_count': user_total_task_count, 'total_task_count_display': '--' if user_total_task_count == 0 else str(user_total_task_count), 'total_rate': round(user_total_rate, 1), 'total_rate_display': '--' if round(user_total_rate, 1) == 0 else str( round(user_total_rate, 1)), 'skills_data': user_skills_data } return data @staticmethod def get_avatar_list(): avatar_list = [] for i in range(12): avatar_list.append({ 'number': i + 1, 'url': settings.STATIC_URL + f'images/ico/people/student_avatars/student_avatar{i+1}.svg' }) return avatar_list @property def current_lesson(self): return self.user.current_lessons.select_related( 'lesson__module__course').first() # if current_lessons.exists(): # return current_lessons.select_related('lesson__module__course').first().lesson # else: # return None @property def is_manager(self): return user_is_manager(self.user)
class Migration(migrations.Migration): initial = True dependencies = [ migrations.swappable_dependency(settings.AUTH_USER_MODEL), ('users', '0003_auto_20190814_1057'), ('goods', '0003_goodsvisitcount'), ] operations = [ migrations.CreateModel( name='OrderGoods', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('create_time', models.DateField(auto_now_add=True, verbose_name='创建时间')), ('update_time', models.DateField(auto_now=True, verbose_name='更新时间')), ('count', models.IntegerField(default=1, verbose_name='数量')), ('price', models.DecimalField(decimal_places=2, max_digits=10, verbose_name='单价')), ('comment', models.TextField(default='', verbose_name='评价信息')), ('score', models.SmallIntegerField(choices=[(0, '0分'), (1, '20分'), (2, '40分'), (3, '60分'), (4, '80分'), (5, '100分')], default=5, verbose_name='满意度评分')), ('is_anonymous', models.BooleanField(default=False, verbose_name='是否匿名评价')), ('is_commented', models.BooleanField(default=False, verbose_name='是否评价了')), ], options={ 'verbose_name': '订单商品', 'verbose_name_plural': '订单商品', 'db_table': 'tb_order_goods', }, ), migrations.CreateModel( name='OrderInfo', fields=[ ('create_time', models.DateField(auto_now_add=True, verbose_name='创建时间')), ('update_time', models.DateField(auto_now=True, verbose_name='更新时间')), ('order_id', models.CharField(max_length=64, primary_key=True, serialize=False, verbose_name='订单号')), ('total_count', models.IntegerField(default=1, verbose_name='商品总数')), ('total_amount', models.DecimalField(decimal_places=2, max_digits=10, verbose_name='商品总金额')), ('freight', models.DecimalField(decimal_places=2, max_digits=10, verbose_name='运费')), ('pay_method', models.SmallIntegerField(choices=[(1, '货到付款'), (2, '支付宝')], default=1, verbose_name='支付方式')), ('status', models.SmallIntegerField(choices=[(1, '待支付'), (2, '待发货'), (3, '待收货'), (4, '待评价'), (5, '已完成'), (6, '已取消')], default=1, verbose_name='订单状态')), ('address', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='users.Address', verbose_name='收货地址')), ('user', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL, verbose_name='下单用户')), ], options={ 'verbose_name': '订单基本信息', 'verbose_name_plural': '订单基本信息', 'db_table': 'tb_order_info', }, ), migrations.AddField( model_name='ordergoods', name='order', field=models.ForeignKey( on_delete=django.db.models.deletion.CASCADE, related_name='skus', to='orders.OrderInfo', verbose_name='订单'), ), migrations.AddField( model_name='ordergoods', name='sku', field=models.ForeignKey( on_delete=django.db.models.deletion.PROTECT, to='goods.SKU', verbose_name='订单商品'), ), ]
class UserProfile(AbstractBaseUser,PermissionsMixin): ''' 继承AbstractUser,扩展用户信息 ''' username = models.CharField(u'昵称', max_length=30, unique=True) first_name = models.CharField(u'名字', max_length=30, blank=True) last_name = models.CharField(u'姓氏', max_length=30, blank=True) email = models.EmailField(u'email', unique=True, null=True, blank=True) is_staff = models.BooleanField(u'职员状态', default=False, help_text='是否能够登录管理后台') is_active = models.BooleanField(u'是否激活', default=True, help_text='用户是否被激活,未激活则不能使用') date_joined = models.DateTimeField(u'创建日期', auto_now_add=True) avatar_url = models.ImageField(upload_to='avatar/%Y/%m', default='avatar/default_big.png', max_length=200, blank=True, null=True, verbose_name=u'头像220x220') avatar_middle_thumbnall = models.ImageField(upload_to='avatar/%Y/%m', default='avatar/default_middle.png', max_length=200, blank=True, null=True, verbose_name=u'头像104x104') avatar_small_thumbnall = models.ImageField(upload_to='avatar/%Y/%m', default='avatar/default_small.png', max_length=200, blank=True, null=True, verbose_name=u'头像70x70') avatar_alt = models.CharField(u'头像ALT说明', max_length=100, blank=True, null=True) qq = models.CharField(u'QQ号码', max_length=20, blank=True, null=True) mobile = models.CharField(u'手机号码', max_length=11, blank=True, null=True, unique=True) valid_email = models.SmallIntegerField(u'是否验证邮箱', default=0, choices=((0, u'否'),(1, u'是'),)) company_name = models.CharField(u'公司名', max_length=150, blank=True, null=True) position = models.CharField(u'职位名', max_length=150, blank=True, null=True) description = models.TextField(u'个人介绍', blank=True, null=True) city = models.CharField(u'城市', max_length=30, null=True, blank=True) province = models.CharField(u'省份', max_length=30, null=True, blank=True) index = models.IntegerField(u'排列顺序(从小到大)',default=999) mylesson = models.ManyToManyField(Lesson, through=u'UserLearningLesson', verbose_name=u'我的学习章节') mystage = models.ManyToManyField(Stage, through=u'UserUnlockStage', verbose_name=u'我的解锁阶段') myfavorite = models.ManyToManyField(Course, through=u'MyFavorite', verbose_name=u'我的收藏') objects = UserProfileManager() USERNAME_FIELD = 'email' REQUIRED_FIELDS = [] class Meta: verbose_name = u'用户' verbose_name_plural = verbose_name db_table = 'user_profile' def get_full_name(self): ''' Returns the first_name plus the last_name, with a space in between. ''' full_name = '%s %s' % (self.first_name, self.last_name) return full_name.strip() def get_short_name(self): 'Returns the short name for the user.' return self.first_name def email_user(self, subject, message, from_email=None, **kwargs): ''' Sends an email to this User. ''' send_mail(subject, message, from_email, [self.email], **kwargs) # 是否是老师 def is_teacher(self): if self.groups.filter(name='老师').count() > 0 : return True return False # 是否是学生 def is_student(self): if self.groups.filter(name='学生').count() > 0 : return True return False def __unicode__(self): return self.username
class Migration(migrations.Migration): dependencies = [ ('products', '0002_auto_20160107_1545'), ] operations = [ migrations.CreateModel( name='ProductImage', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(max_length=128)), ('image', models.ImageField(upload_to='images')), ('product', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='products.Product')), ], ), migrations.AddField( model_name='category', name='image', field=models.ImageField( default=1234, help_text= 'The recommended size of a image is 80 x 80(+/-) px. But you can use any image sizes, they will be compressed or increased to the appropriate value.', upload_to='images'), preserve_default=False, ), migrations.AddField( model_name='technology', name='image', field=models.ImageField( default=123, help_text= 'The recommended size of a image is 80 x 80(+/-) px. But you can use any image sizes, they will be compressed or increased to the appropriate value.', upload_to='images'), preserve_default=False, ), migrations.AlterField( model_name='touch', name='i_f', field=models.CharField(blank=True, max_length=32, null=True, verbose_name='Touch I/F'), ), migrations.AlterField( model_name='touch', name='points', field=models.SmallIntegerField(default=1, verbose_name='Touch Points'), ), migrations.AlterField( model_name='touch', name='type', field=models.CharField(max_length=128, verbose_name='Touch Type'), ), ]
class Migration(migrations.Migration): initial = True dependencies = [ migrations.swappable_dependency(settings.AUTH_USER_MODEL), ] operations = [ migrations.CreateModel( name='Date', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('created_at', models.DateTimeField(auto_now_add=True)), ('updated_at', models.DateTimeField(auto_now=True)), ('status', models.SmallIntegerField(choices=[(0, 'Inactive'), (1, 'Active')])), ('resume', models.TextField(blank=True)), ('date', models.DateField()), ('stars', models.PositiveSmallIntegerField(validators=[django.core.validators.MaxValueValidator(5), django.core.validators.MinValueValidator(1)])), ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), ], options={ 'abstract': False, }, ), migrations.CreateModel( name='Dedication', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('created_at', models.DateTimeField(auto_now_add=True)), ('updated_at', models.DateTimeField(auto_now=True)), ('status', models.SmallIntegerField(choices=[(0, 'Inactive'), (1, 'Active')])), ('cycle', models.PositiveSmallIntegerField(default=1, validators=[django.core.validators.MaxValueValidator(8), django.core.validators.MinValueValidator(1)])), ('time', models.PositiveSmallIntegerField(validators=[django.core.validators.MinValueValidator(10)])), ], options={ 'abstract': False, }, ), migrations.CreateModel( name='Role', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('created_at', models.DateTimeField(auto_now_add=True)), ('updated_at', models.DateTimeField(auto_now=True)), ('status', models.SmallIntegerField(choices=[(0, 'Inactive'), (1, 'Active')])), ('name', models.CharField(max_length=50)), ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), ], options={ 'abstract': False, }, ), migrations.CreateModel( name='SmallNote', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('created_at', models.DateTimeField(auto_now_add=True)), ('updated_at', models.DateTimeField(auto_now=True)), ('status', models.SmallIntegerField(choices=[(0, 'Inactive'), (1, 'Active')])), ('text', models.TextField()), ('date', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='diary.Date')), ('role', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='diary.Role')), ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), ], options={ 'abstract': False, }, ), migrations.CreateModel( name='Task', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('created_at', models.DateTimeField(auto_now_add=True)), ('updated_at', models.DateTimeField(auto_now=True)), ('status', models.SmallIntegerField(choices=[(0, 'Inactive'), (1, 'Active')])), ], options={ 'abstract': False, }, ), migrations.CreateModel( name='TypeDedication', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('created_at', models.DateTimeField(auto_now_add=True)), ('updated_at', models.DateTimeField(auto_now=True)), ('status', models.SmallIntegerField(choices=[(0, 'Inactive'), (1, 'Active')])), ('name', models.CharField(max_length=50)), ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), ], options={ 'abstract': False, }, ), migrations.CreateModel( name='TypeTask', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('created_at', models.DateTimeField(auto_now_add=True)), ('updated_at', models.DateTimeField(auto_now=True)), ('status', models.SmallIntegerField(choices=[(0, 'Inactive'), (1, 'Active')])), ('name', models.CharField(max_length=50)), ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), ], options={ 'abstract': False, }, ), migrations.AddField( model_name='task', name='type', field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='diary.TypeTask'), ), migrations.AddField( model_name='task', name='user', field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), ), migrations.AddField( model_name='dedication', name='type', field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='diary.TypeDedication'), ), migrations.AddField( model_name='dedication', name='user', field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), ), ]
class Object(models.Model): id = models.CharField(primary_key=True, editable=False, max_length=30) title = models.CharField(max_length=5048, null=True) region = models.SmallIntegerField(null=True) signDate = models.DateField(null=True) contract = models.ForeignKey(Contract, on_delete=models.CASCADE)
class Migration(migrations.Migration): initial = True dependencies = [ ] operations = [ migrations.CreateModel( name='AuthGroup', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(max_length=80, unique=True)), ], options={ 'db_table': 'auth_group', 'managed': False, }, ), migrations.CreateModel( name='AuthGroupPermissions', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ], options={ 'db_table': 'auth_group_permissions', 'managed': False, }, ), migrations.CreateModel( name='AuthPermission', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(max_length=255)), ('codename', models.CharField(max_length=100)), ], options={ 'db_table': 'auth_permission', 'managed': False, }, ), migrations.CreateModel( name='AuthUser', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('password', models.CharField(max_length=128)), ('last_login', models.DateTimeField(blank=True, null=True)), ('is_superuser', models.IntegerField()), ('username', models.CharField(max_length=150, unique=True)), ('first_name', models.CharField(max_length=30)), ('last_name', models.CharField(max_length=150)), ('email', models.CharField(max_length=254)), ('is_staff', models.IntegerField()), ('is_active', models.IntegerField()), ('date_joined', models.DateTimeField()), ], options={ 'db_table': 'auth_user', 'managed': False, }, ), migrations.CreateModel( name='AuthUserGroups', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ], options={ 'db_table': 'auth_user_groups', 'managed': False, }, ), migrations.CreateModel( name='AuthUserUserPermissions', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ], options={ 'db_table': 'auth_user_user_permissions', 'managed': False, }, ), migrations.CreateModel( name='City', fields=[ ('id', models.AutoField(db_column='ID', primary_key=True, serialize=False)), ('name', models.CharField(db_column='Name', max_length=35)), ('district', models.CharField(db_column='District', max_length=20)), ('population', models.IntegerField(db_column='Population')), ], options={ 'db_table': 'city', 'managed': False, }, ), migrations.CreateModel( name='Country', fields=[ ('code', models.CharField(db_column='Code', max_length=3, primary_key=True, serialize=False)), ('continent', models.CharField(db_column='Continent', max_length=13)), ('region', models.CharField(db_column='Region', max_length=26)), ('surfacearea', models.FloatField(db_column='SurfaceArea')), ('indepyear', models.SmallIntegerField(blank=True, db_column='IndepYear', null=True)), ('population', models.IntegerField(db_column='Population')), ('lifeexpectancy', models.FloatField(blank=True, db_column='LifeExpectancy', null=True)), ('gnp', models.FloatField(blank=True, db_column='GNP', null=True)), ('gnpold', models.FloatField(blank=True, db_column='GNPOld', null=True)), ('localname', models.CharField(db_column='LocalName', max_length=45)), ('governmentform', models.CharField(db_column='GovernmentForm', max_length=45)), ('headofstate', models.CharField(blank=True, db_column='HeadOfState', max_length=60, null=True)), ('capital', models.IntegerField(blank=True, db_column='Capital', null=True)), ('code2', models.CharField(db_column='Code2', max_length=2)), ], options={ 'db_table': 'country', 'managed': False, }, ), migrations.CreateModel( name='Countrylanguage', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('language', models.CharField(db_column='Language', max_length=30)), ('isofficial', models.CharField(db_column='IsOfficial', max_length=1)), ('percentage', models.FloatField(db_column='Percentage')), ], options={ 'db_table': 'countrylanguage', 'managed': False, }, ), migrations.CreateModel( name='DjangoAdminLog', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('action_time', models.DateTimeField()), ('object_id', models.TextField(blank=True, null=True)), ('object_repr', models.CharField(max_length=200)), ('action_flag', models.SmallIntegerField()), ('change_message', models.TextField()), ], options={ 'db_table': 'django_admin_log', 'managed': False, }, ), migrations.CreateModel( name='DjangoContentType', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('app_label', models.CharField(max_length=100)), ('model', models.CharField(max_length=100)), ], options={ 'db_table': 'django_content_type', 'managed': False, }, ), migrations.CreateModel( name='DjangoMigrations', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('app', models.CharField(max_length=255)), ('name', models.CharField(max_length=255)), ('applied', models.DateTimeField()), ], options={ 'db_table': 'django_migrations', 'managed': False, }, ), migrations.CreateModel( name='DjangoSession', fields=[ ('session_key', models.CharField(max_length=40, primary_key=True, serialize=False)), ('session_data', models.TextField()), ('expire_date', models.DateTimeField()), ], options={ 'db_table': 'django_session', 'managed': False, }, ), ]
class Test(models.Model): exam = models.ForeignKey(Exam, on_delete=models.CASCADE) score = models.PositiveSmallIntegerField() minutes_left = models.SmallIntegerField() date = models.DateField(auto_now_add=True)
class SiteProfile(SiteProfileBase): settings = django_settings.SPEEDY_MATCH_SITE_PROFILE_SETTINGS LOCALIZABLE_FIELDS = ('profile_description', 'city', 'children', 'more_children', 'match_description') RELATED_NAME = 'speedy_match_site_profile' HEIGHT_VALID_VALUES = range(settings.MIN_HEIGHT_ALLOWED, settings.MAX_HEIGHT_ALLOWED + 1) AGE_MATCH_VALID_VALUES = range(settings.MIN_AGE_MATCH_ALLOWED, settings.MAX_AGE_MATCH_ALLOWED + 1) SMOKING_STATUS_UNKNOWN = 0 SMOKING_STATUS_NO = 1 SMOKING_STATUS_SOMETIMES = 2 SMOKING_STATUS_YES = 3 SMOKING_STATUS_MAX_VALUE_PLUS_ONE = 4 SMOKING_STATUS_CHOICES_WITH_DEFAULT = ( (SMOKING_STATUS_UNKNOWN, _("Unknown")), (SMOKING_STATUS_NO, _("No")), (SMOKING_STATUS_SOMETIMES, _("Sometimes")), (SMOKING_STATUS_YES, _("Yes")), ) SMOKING_STATUS_VALID_CHOICES = SMOKING_STATUS_CHOICES_WITH_DEFAULT[1:] SMOKING_STATUS_VALID_VALUES = [ choice[0] for choice in SMOKING_STATUS_VALID_CHOICES ] MARITAL_STATUS_UNKNOWN = 0 MARITAL_STATUS_SINGLE = 1 MARITAL_STATUS_DIVORCED = 2 MARITAL_STATUS_WIDOWED = 3 MARITAL_STATUS_IN_RELATIONSHIP = 4 MARITAL_STATUS_IN_OPEN_RELATIONSHIP = 5 MARITAL_STATUS_COMPLICATED = 6 MARITAL_STATUS_SEPARATED = 7 MARITAL_STATUS_MARRIED = 8 MARITAL_STATUS_MAX_VALUE_PLUS_ONE = 9 MARITAL_STATUS_CHOICES_WITH_DEFAULT = ( (MARITAL_STATUS_UNKNOWN, _("Unknown")), (MARITAL_STATUS_SINGLE, _("Single")), (MARITAL_STATUS_DIVORCED, _("Divorced")), (MARITAL_STATUS_WIDOWED, _("Widowed")), (MARITAL_STATUS_IN_RELATIONSHIP, _("In a relatioship")), (MARITAL_STATUS_IN_OPEN_RELATIONSHIP, _("In an open relationship")), (MARITAL_STATUS_COMPLICATED, _("It's complicated")), (MARITAL_STATUS_SEPARATED, _("Separated")), (MARITAL_STATUS_MARRIED, _("Married")), ) MARITAL_STATUS_VALID_CHOICES = MARITAL_STATUS_CHOICES_WITH_DEFAULT[1:] MARITAL_STATUS_VALID_VALUES = [ choice[0] for choice in MARITAL_STATUS_VALID_CHOICES ] RANK_0 = 0 RANK_1 = 1 RANK_2 = 2 RANK_3 = 3 RANK_4 = 4 RANK_5 = 5 RANK_CHOICES = ( (RANK_0, _("0 hearts")), (RANK_1, _("1 hearts")), (RANK_2, _("2 hearts")), (RANK_3, _("3 hearts")), (RANK_4, _("4 hearts")), (RANK_5, _("5 hearts")), ) RANK_VALID_VALUES = [choice[0] for choice in RANK_CHOICES] @staticmethod def gender_to_match_default(): return list() @staticmethod def diet_match_default(): return dict( {str(diet): __class__.RANK_5 for diet in User.DIET_VALID_VALUES}) @staticmethod def smoking_status_match_default(): return dict({ str(smoking_status): __class__.RANK_5 for smoking_status in __class__.SMOKING_STATUS_VALID_VALUES }) @staticmethod def marital_status_match_default(): return dict({ str(marital_status): __class__.RANK_5 for marital_status in __class__.MARITAL_STATUS_VALID_VALUES }) @staticmethod def smoking_status_choices(gender): return ( # (__class__.SMOKING_STATUS_UNKNOWN, _("Unknown")), # ~~~~ TODO: remove this line! (__class__.SMOKING_STATUS_NO, pgettext_lazy(context=gender, message="No")), (__class__.SMOKING_STATUS_SOMETIMES, pgettext_lazy(context=gender, message="Sometimes")), (__class__.SMOKING_STATUS_YES, pgettext_lazy(context=gender, message="Yes")), ) @staticmethod def marital_status_choices(gender): return ( # (__class__.MARITAL_STATUS_UNKNOWN, _("Unknown")), # ~~~~ TODO: remove this line! (__class__.MARITAL_STATUS_SINGLE, pgettext_lazy(context=gender, message="Single")), (__class__.MARITAL_STATUS_DIVORCED, pgettext_lazy(context=gender, message="Divorced")), (__class__.MARITAL_STATUS_WIDOWED, pgettext_lazy(context=gender, message="Widowed")), (__class__.MARITAL_STATUS_IN_RELATIONSHIP, pgettext_lazy(context=gender, message="In a relatioship")), (__class__.MARITAL_STATUS_IN_OPEN_RELATIONSHIP, pgettext_lazy(context=gender, message="In an open relationship")), (__class__.MARITAL_STATUS_COMPLICATED, pgettext_lazy(context=gender, message="It's complicated")), (__class__.MARITAL_STATUS_SEPARATED, pgettext_lazy(context=gender, message="Separated")), (__class__.MARITAL_STATUS_MARRIED, pgettext_lazy(context=gender, message="Married")), ) user = models.OneToOneField(to=User, verbose_name=_('user'), primary_key=True, on_delete=models.CASCADE, related_name=RELATED_NAME) notify_on_like = models.PositiveIntegerField( verbose_name=_('on new likes'), choices=User.NOTIFICATIONS_CHOICES, default=User.NOTIFICATIONS_ON) active_languages = models.TextField(verbose_name=_('active languages'), blank=True) height = models.SmallIntegerField(verbose_name=_('height'), help_text=_('cm'), blank=True, null=True) # ~~~~ TODO: diet, smoking_status and marital_status - decide which model should contain them - are they relevant also to Speedy Net or only to Speedy Match? smoking_status = models.SmallIntegerField( verbose_name=_('smoking status'), choices=SMOKING_STATUS_CHOICES_WITH_DEFAULT, default=SMOKING_STATUS_UNKNOWN) marital_status = models.SmallIntegerField( verbose_name=_('marital status'), choices=MARITAL_STATUS_CHOICES_WITH_DEFAULT, default=MARITAL_STATUS_UNKNOWN) profile_description = TranslatedField( models.TextField(verbose_name=_('Few words about me'), blank=True, null=True)) city = TranslatedField( models.CharField(verbose_name=_('city or locality'), max_length=255, blank=True, null=True)) children = TranslatedField( models.TextField(verbose_name=_('Do you have children? How many?'), blank=True, null=True)) more_children = TranslatedField( models.TextField(verbose_name=_('Do you want (more) children?'), blank=True, null=True)) match_description = TranslatedField( models.TextField(verbose_name=_('My ideal match'), blank=True, null=True)) gender_to_match = ArrayField(models.SmallIntegerField(), verbose_name=_('Gender'), size=len(User.GENDER_VALID_VALUES), default=gender_to_match_default.__func__, blank=True, null=True) min_age_match = models.SmallIntegerField( verbose_name=_('minimal age to match'), default=settings.MIN_AGE_MATCH_ALLOWED) max_age_match = models.SmallIntegerField( verbose_name=_('maximal age to match'), default=settings.MAX_AGE_MATCH_ALLOWED) diet_match = JSONField(verbose_name=_('diet match'), default=diet_match_default.__func__) smoking_status_match = JSONField( verbose_name=_('smoking status match'), default=smoking_status_match_default.__func__) marital_status_match = JSONField( verbose_name=_('marital status match'), default=marital_status_match_default.__func__) activation_step = models.PositiveSmallIntegerField(default=2) objects = SiteProfileManager() @property def is_active(self): return ((self.user.is_active) and (get_language() in self.get_active_languages())) class Meta: verbose_name = _('Speedy Match Profile') verbose_name_plural = _('Speedy Match Profiles') def __str__(self): return '{} @ Speedy Match'.format(self.user) def _set_active_languages(self, languages): languages = sorted(list(set(languages))) self.active_languages = ','.join(set(languages)) def _deactivate_language(self, step): # Profile is invalid. Deactivate in this language. language_code = get_language() self._set_active_languages( set(self.get_active_languages()) - {language_code}) self.activation_step = step self.user.save_user_and_profile() def get_active_languages(self): return list( filter(None, (l.strip() for l in self.active_languages.split(',')))) def validate_profile_and_activate(self): # ~~~~ TODO: all the error messages in this function may depend on the current user's (or other user's) gender. from speedy.match.accounts import utils language_code = get_language() error_messages = [] for step in utils.get_steps_range(): fields = utils.get_step_fields_to_validate(step=step) for field_name in fields: try: utils.validate_field(field_name=field_name, user=self.user) except ValidationError as e: error_messages.append(str(e)) if (len(error_messages) > 0): self._deactivate_language(step=step) return step, error_messages # Registration form is complete. Check if the user has a confirmed email address. step = len(__class__.settings.SPEEDY_MATCH_SITE_PROFILE_FORM_FIELDS) if ((self.user.has_confirmed_email()) and (step >= self.activation_step)): # Profile is valid. Activate in this language. languages = self.get_active_languages() if (not (language_code in languages)): languages.append(language_code) self._set_active_languages(languages=languages) self.user.save_user_and_profile() else: self._deactivate_language(step=self.activation_step) error_messages.append(_("Please confirm your email address.")) return step, error_messages def call_after_verify_email_address(self): old_step = self.activation_step self.activation_step = len( __class__.settings.SPEEDY_MATCH_SITE_PROFILE_FORM_FIELDS) self.validate_profile_and_activate() self.activation_step = old_step self.user.save_user_and_profile() def get_matching_rank(self, other_profile, second_call=True) -> int: self.validate_profile_and_activate() try: other_profile.validate_profile_and_activate() except ValidationError as e: logger.error( "get_matching_rank::other_profile.validate_profile_and_activate() failed, other_profile.user.pk={other_user_pk}, other_profile.user.username={other_user_username}, other_profile.user.slug={other_user_slug}, e={e}" .format( other_user_pk=other_profile.user.pk, other_user_username=other_profile.user.username, other_user_slug=other_profile.user.slug, e=e, )) return self.__class__.RANK_0 if (self.user.pk == other_profile.user.pk): return self.__class__.RANK_0 if ((self.is_active) and (other_profile.is_active)): if (Block.objects.there_is_block(user_1=self.user, user_2=other_profile.user)): return self.__class__.RANK_0 if (other_profile.user.gender not in self.gender_to_match): return self.__class__.RANK_0 if (not (self.min_age_match <= other_profile.user.get_age() <= self.max_age_match)): return self.__class__.RANK_0 if (other_profile.user.diet == User.DIET_UNKNOWN): return self.__class__.RANK_0 if (other_profile.smoking_status == self.__class__.SMOKING_STATUS_UNKNOWN): return self.__class__.RANK_0 if (other_profile.marital_status == self.__class__.MARITAL_STATUS_UNKNOWN): return self.__class__.RANK_0 diet_rank = self.diet_match.get(str(other_profile.user.diet), self.__class__.RANK_5) smoking_status_rank = self.smoking_status_match.get( str(other_profile.smoking_status), self.__class__.RANK_5) marital_status_rank = self.marital_status_match.get( str(other_profile.marital_status), self.__class__.RANK_5) rank = min([diet_rank, smoking_status_rank, marital_status_rank]) if (rank > self.__class__.RANK_0) and (second_call): other_user_rank = other_profile.get_matching_rank( other_profile=self, second_call=False) if (other_user_rank == self.__class__.RANK_0): rank = self.__class__.RANK_0 other_profile.rank = rank return rank else: return self.__class__.RANK_0 def deactivate(self): self._set_active_languages([]) self.activation_step = 0 self.user.save_user_and_profile() def get_name(self): # Speedy Match name is user's first name. return self.user.get_first_name() def get_match_gender(self): if (len(self.gender_to_match) == 1): return User.GENDERS_DICT.get(self.gender_to_match[0]) else: return User.GENDERS_DICT.get(User.GENDER_OTHER) def get_smoking_status_choices(self): return self.__class__.smoking_status_choices( gender=self.user.get_gender()) def get_marital_status_choices(self): return self.__class__.marital_status_choices( gender=self.user.get_gender()) def get_diet_match_choices(self): return User.diet_choices(gender=self.get_match_gender()) def get_smoking_status_match_choices(self): return self.__class__.smoking_status_choices( gender=self.get_match_gender()) def get_marital_status_match_choices(self): return self.__class__.marital_status_choices( gender=self.get_match_gender())
class Migration(migrations.Migration): initial = True dependencies = [ ] operations = [ migrations.CreateModel( name='AuctionBid', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('user_bid', models.SmallIntegerField()), ('bid_time', models.DateTimeField(auto_now=True)), ], ), migrations.CreateModel( name='Cart', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('number', models.PositiveSmallIntegerField()), ], ), migrations.CreateModel( name='DeliveryAddress', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('delivery_phone', models.CharField(max_length=30)), ('delivery_name', models.CharField(max_length=30)), ('address', models.CharField(max_length=255)), ('postcode', models.CharField(max_length=30)), ], ), migrations.CreateModel( name='Goods', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('remaining_number', models.PositiveIntegerField()), ('goods_name', models.CharField(max_length=255)), ('description', models.TextField()), ('category', models.CharField(blank=True, max_length=255)), ('status', models.CharField(choices=[('ON', 'ON SALE'), ('OFF', 'OFF SHELVES')], default='ON', max_length=20)), ('sale_type', models.CharField(blank=True, choices=[('OA', '仅限拍卖'), ('OB', '拍卖与一口价'), ('PB', '仅限一口价')], max_length=30)), ('start_bid', models.SmallIntegerField(blank=True)), ('current_bid', models.SmallIntegerField(blank=True)), ('buy_it_now_price', models.SmallIntegerField(blank=True)), ('image_description', models.ImageField(blank=True, upload_to='goods_image/%Y/%m/%d')), ('image_description_2', models.ImageField(blank=True, upload_to='goods_image/%Y/%m/%d')), ('image_description_3', models.ImageField(blank=True, upload_to='goods_image/%Y/%m/%d')), ('image_description_4', models.ImageField(blank=True, upload_to='goods_image/%Y/%m/%d')), ('image_description_5', models.ImageField(blank=True, upload_to='goods_image/%Y/%m/%d')), ], ), migrations.CreateModel( name='Order', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('start_time', models.DateTimeField(auto_now_add=True)), ('end_time', models.DateTimeField(blank=True)), ('status', models.CharField(choices=[('DONE', '交易完成'), ('DOING', '正在进行'), ('AB', '交易关闭')], default='DOING', max_length=20)), ('goods', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='AuctionHouse.Goods')), ], ), migrations.CreateModel( name='User', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('user_name', models.CharField(max_length=30)), ('email', models.EmailField(max_length=254)), ('password', models.CharField(max_length=255)), ('real_name', models.CharField(max_length=30)), ('real_id', models.CharField(max_length=30)), ('gender', models.CharField(choices=[('M', 'Male'), ('F', 'Female')], default='M', max_length=20)), ('portrait', models.ImageField(blank=True, upload_to='user_portrait/')), ('birthday', models.DateField(blank=True)), ('phone', models.CharField(max_length=30)), ('credit', models.FloatField(default=0)), ], ), migrations.AddField( model_name='order', name='user', field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='AuctionHouse.User'), ), migrations.AddField( model_name='goods', name='current_bid_buyer', field=models.ForeignKey(blank=True, on_delete=django.db.models.deletion.CASCADE, related_name='current_bid_buyer', to='AuctionHouse.User'), ), migrations.AddField( model_name='goods', name='vendor', field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='vendor', to='AuctionHouse.User'), ), migrations.AddField( model_name='deliveryaddress', name='user_id', field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='AuctionHouse.User'), ), migrations.AddField( model_name='cart', name='goods', field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='AuctionHouse.Goods'), ), migrations.AddField( model_name='cart', name='user', field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='AuctionHouse.User'), ), migrations.AddField( model_name='auctionbid', name='goods', field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='AuctionHouse.Goods'), ), migrations.AddField( model_name='auctionbid', name='user', field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='AuctionHouse.User'), ), ]
class Feed(models.Model): """An RSS feed .. attribute:: name The name of the feed. .. attribute:: feed_url The URL the feed is located at. .. attribute:: description The feeds description in full text/HTML. .. attribute:: link The link the feed says it's located at. Can be different from :attr:`feed_url` as it's the source we got from the user. .. attribute:: date_last_refresh Date of the last time this feed was refreshed. .. attribute:: last_error The last error message (if any). .. attribute:: ratio The apparent importance of this feed. """ supports_categories = False supports_enclosures = False name = models.CharField(_(u"name"), max_length=200) feed_url = models.URLField(_(u"feed URL"), unique=True) description = models.TextField(_(u"description")) link = models.URLField(_(u"link"), max_length=200, blank=True) http_etag = models.CharField(_(u"E-Tag"), editable=False, blank=True, null=True, max_length=200) http_last_modified = models.DateTimeField(_(u"Last-Modified"), null=True, editable=False, blank=True) date_last_refresh = models.DateTimeField(_(u"date of last refresh"), null=True, blank=True, editable=False) categories = models.ManyToManyField(Category) last_error = models.CharField(_(u"last error"), blank=True, default="", max_length=32, choices=FEED_ERROR_CHOICES) ratio = models.FloatField(default=0.0) sort = models.SmallIntegerField(_(u"sort order"), default=0) date_created = models.DateTimeField(_(u"date created"), auto_now_add=True) date_changed = models.DateTimeField(_(u"date changed"), auto_now=True) # this date is used to know if the feed is still used by some # real users. Update the value when the user use the feed. date_last_requested = models.DateTimeField(_(u"last requested"), auto_now_add=True) summary_detail_link_regex = models.CharField( max_length=1000, blank=True, null=True, help_text=_('''A regular expression to extra the link from the entry\'s summary detail section. This is useful when the entry\'s main link is a wrapper but the summary contains the true URL.''')) is_active = models.BooleanField(_(u"is active"), default=True) freq = models.IntegerField(_(u"frequency"), default=conf.REFRESH_EVERY) objects = FeedManager() class Meta: ordering = ("id", ) verbose_name = _(u"feed") verbose_name_plural = _(u"feeds") def __init__(self, *args, **kwargs): super(Feed, self).__init__(*args, **kwargs) self.poststore = backend_or_default() def natural_key(self): return (self.feed_url, ) natural_key.dependencies = [] def __str__(self): return u"%s (%s)" % (self.name, self.feed_url) def fresh(self): return type(self).objects.get_fresh().filter(id=self.id).exists() fresh.boolean = True def get_posts(self, **kwargs): """Get all :class:`Post`s for this :class:`Feed` in order.""" return self.poststore.all_posts_by_order(self) def get_post_count(self): return self.poststore.get_post_count(self) def frequencies(self, limit=None, order="-date_updated"): posts = self.post_set.values("date_updated").order_by(order)[0:limit] return [ posts[i - 1]["date_updated"] - post["date_updated"] for i, post in enumerate(posts) if i ] def average_frequency(self, limit=None, min=5, default=timedelta(hours=2)): # pylint: disable=redefined-builtin freqs = self.frequencies(limit=limit) if len(freqs) < min: return default average = sum(map(timedelta_seconds, freqs)) / len(freqs) return timedelta(seconds=average) def update_frequency(self, limit=None, min=5, save=True): # pylint: disable=redefined-builtin self.freq = timedelta_seconds(self.average_frequency(limit, min)) if save: self.save() def expire_old_posts(self, min_posts=30, max_posts=120): """Expire old posts. :keyword min_posts: Minimum number of post by feed. :keyword max_posts: The maximum number of posts to keep for a feed. We keep this value high to avoid incessant delete on feed that have a bit more than the `min_posts` value. :keyword commit: Commit the transaction, set to ``False`` if you want to manually handle the transaction. :returns: The number of messages deleted. """ by_date = self.post_set.order_by("-date_published") if len(by_date) > max_posts: expired_posts = [ post["id"] for post in by_date.values("id")[min_posts:] ] Post.objects.filter(pk__in=expired_posts).delete() return len(expired_posts) return 0 def is_error_status(self, status): return status == http.NOT_FOUND or status not in ACCEPTED_STATUSES def error_for_status(self, status): if status == http.NOT_FOUND: return FEED_NOT_FOUND_ERROR if status not in ACCEPTED_STATUSES: return FEED_GENERIC_ERROR def save_error(self, error_msg): self._set_last_error = True self.last_error = error_msg self.save() return self def save_generic_error(self): return self.save_error(FEED_GENERIC_ERROR) def save_timeout_error(self): return self.save_error(FEED_TIMEDOUT_ERROR) def set_error_status(self, status): return self.save_error(self.error_for_status(status)) @property def date_last_refresh_naturaldate(self): return text_type(naturaldate(self.date_last_refresh))
class Migration(migrations.Migration): initial = True dependencies = [ ('contenttypes', '0002_remove_content_type_name'), migrations.swappable_dependency(settings.AUTH_USER_MODEL), ] operations = [ migrations.CreateModel( name='Course', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('catalog_number', models.CharField(max_length=20, verbose_name='Number')), ('title', models.CharField(max_length=256, verbose_name='Title')), ('description', models.CharField(blank=True, max_length=256, verbose_name='Description')), ('credits_earned', models.DecimalField(decimal_places=1, max_digits=2, verbose_name='Credits')), ('graduate', models.BooleanField(default=False, verbose_name='Graduate Level')), ], options={ 'ordering': ['major', 'catalog_number', 'title'], }, ), migrations.CreateModel( name='Interval', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('interval_amount', models.IntegerField(validators=[django.core.validators.MinValueValidator(1)], verbose_name='Interval Amount')), ('interval_type', models.CharField(choices=[('weeks', 'weeks'), ('days', 'days'), ('months', 'months'), ('minutes', 'minutes'), ('hours', 'hours'), ('seconds', 'seconds')], max_length=7, verbose_name='Interval Type')), ], ), migrations.CreateModel( name='Major', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('abbreviation', sis.models.UpperField(max_length=6, unique=True, verbose_name='Abbreviation')), ('title', models.CharField(max_length=256, verbose_name='Title')), ('description', models.CharField(blank=True, max_length=256, verbose_name='Description')), ], options={ 'ordering': ['abbreviation'], }, ), migrations.CreateModel( name='Professor', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('major', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='sis.major')), ], options={ 'ordering': ['profile__user__username'], }, ), migrations.CreateModel( name='Profile', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('role', models.CharField(choices=[('A', 'Admin'), ('P', 'Professor'), ('S', 'Student'), ('-', 'NO ACCESS')], default='-', max_length=1)), ('bio', models.CharField(blank=True, max_length=256)), ('demo_age', models.CharField(blank=True, choices=[('Under 18', 'Under 18'), ('18-21', '18-21'), ('22-25', '22-25'), ('26-30', '26-30'), ('31-40', '31-40'), ('41-54', '41-54'), ('55-64', '55-64'), ('65 or over', '65 or over'), ('Decline to State', 'Decline to State')], max_length=20, verbose_name='Age Group')), ('demo_race', models.CharField(blank=True, choices=[('White/Caucasian', 'White/Caucasian'), ('Native Hawaiian or Pacific Islander', 'Native Hawaiian or Pacific Islander'), ('Hispanic', 'Hispanic'), ('Black', 'Black'), ('American Indian/Alaska Native', 'American Indian/Alaska Native'), ('Decline to State', 'Decline to State')], max_length=40)), ('demo_gender', models.CharField(blank=True, choices=[('Male', 'Male'), ('Female', 'Female'), ('Trans', 'Trans'), ('Non-Binary', 'Non-Binary'), ('Other', 'Other'), ('Decline to State', 'Decline to State')], max_length=20)), ('demo_employment', models.CharField(blank=True, choices=[('Full Time Student', 'Full Time Student'), ('Part Time', 'Part Time'), ('Full Time', 'Full Time'), ('Unemployed/Seeking', 'Unemployed/Seeking'), ('Retired', 'Retired'), ('Decline to State', 'Decline to State')], max_length=20)), ('demo_income', models.CharField(blank=True, choices=[('Under $40K', 'Under $40K'), ('$40K-$80K', '$40K-$80K'), ('$80K-$150K', '$80K-$150K'), ('$150K+', '$150K+'), ('Decline to State', 'Decline to State')], max_length=20)), ('demo_education', models.CharField(blank=True, choices=[('partial High School', 'partial High School'), ('High School Diploma', 'High School Diploma'), ('college without degree awarded', 'college without degree awarded'), ('Associates', 'Associates'), ('College Bachelors', 'College Bachelors'), ('Masters', 'Masters'), ('Doctorate', 'Doctorate'), ('Decline to State', 'Decline to State')], max_length=35)), ('demo_orientation', models.CharField(blank=True, choices=[('Heterosexual', 'Heterosexual'), ('Lesbian/Gay', 'Lesbian/Gay'), ('Bisexual', 'Bisexual'), ('Other', 'Other'), ('Decline to State', 'Decline to State')], max_length=20)), ('demo_marital', models.CharField(blank=True, choices=[('Single', 'Single'), ('Married', 'Married'), ('Divorced', 'Divorced'), ('Widowed', 'Widowed'), ('Decline to State', 'Decline to State')], max_length=20)), ('demo_disability', models.CharField(blank=True, choices=[('None', 'None'), ('Physical', 'Physical'), ('Emotional', 'Emotional'), ('Mental', 'Mental'), ('Other', 'Other'), ('Decline to State', 'Decline to State')], max_length=20)), ('demo_veteran', models.CharField(blank=True, choices=[('None', 'None'), ('Veteran', 'Veteran'), ('Decline to State', 'Decline to State')], max_length=20)), ('demo_citizenship', models.CharField(blank=True, choices=[('United States', 'United States'), ('US Permanent Resident', 'US Permanent Resident'), ('Visa', 'Visa'), ('Other', 'Other'), ('Decline to State', 'Decline to State')], max_length=25)), ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), ], options={ 'ordering': ['user__username'], }, ), migrations.CreateModel( name='ReferenceItem', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('title', models.CharField(max_length=256, verbose_name='Title')), ('description', models.CharField(blank=True, max_length=256, null=True, verbose_name='Description')), ('link', models.CharField(blank=True, max_length=256, null=True, verbose_name='Link')), ('edition', models.CharField(blank=True, max_length=256, null=True, verbose_name='Edition')), ('type', models.CharField(choices=[('req', 'Required'), ('opt', 'Optional'), ('rec', 'Recommended'), ('syl', 'Syllabus'), ('ass', 'Assignment')], default='req', max_length=3, verbose_name='Type')), ('isbn', isbn_field.fields.ISBNField(blank=True, max_length=28, validators=[isbn_field.validators.ISBNValidator], verbose_name='ISBN')), ('course', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='sis.course')), ('professor', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='sis.professor')), ], options={ 'unique_together': {('course', 'professor', 'title')}, }, ), migrations.CreateModel( name='Section', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('number', models.IntegerField(default=1, validators=[django.core.validators.MinValueValidator(1)], verbose_name='Section Number')), ('capacity', models.IntegerField(default=0, validators=[django.core.validators.MinValueValidator(1)], verbose_name='Capacity')), ('location', models.CharField(max_length=256, verbose_name='Location')), ('hours', models.CharField(max_length=256, verbose_name='Hours')), ('status', models.CharField(choices=[('Closed', 'Closed'), ('Open', 'Open'), ('In Progress', 'In Progress'), ('Grading', 'Grading'), ('Graded', 'Graded'), ('Cancelled', 'Cancelled')], default='Closed', max_length=20, verbose_name='Section Status')), ('course', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='sis.course')), ('professor', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='sis.professor')), ], options={ 'ordering': ['semester', 'course', 'number'], }, ), migrations.CreateModel( name='Semester', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('date_registration_opens', models.DateField(verbose_name='Registration Opens')), ('date_registration_closes', models.DateField(help_text='Must be on or after Registration Opens', verbose_name='Registration Closes')), ('date_started', models.DateField(help_text='Must on or after Registration Opens', verbose_name='Classes Start')), ('date_last_drop', models.DateField(help_text='Must be on or after Classes Start and before Classes End', verbose_name='Last Drop')), ('date_ended', models.DateField(help_text='Must be on or after Classes Start', verbose_name='Classes End')), ('date_finalized', models.DateField(help_text='Must be on or after Classes End', verbose_name='Grades Finalized')), ('session', models.CharField(choices=[('FA', 'Fall'), ('WI', 'Winter'), ('SP', 'Spring'), ('SU', 'Summer')], default='FA', max_length=6, verbose_name='semester')), ('year', models.IntegerField(default=2000, help_text='School Year', validators=[django.core.validators.MinValueValidator(1900), django.core.validators.MaxValueValidator(2300)], verbose_name='year')), ], options={ 'ordering': ['date_started'], 'unique_together': {('session', 'year')}, }, ), migrations.CreateModel( name='SemesterStudent', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('grade_points', models.FloatField(null=True, verbose_name='Grade Points')), ('credits_attempted', models.DecimalField(decimal_places=1, default=Decimal('0.0'), max_digits=3, verbose_name='Attempted')), ('credits_earned', models.DecimalField(decimal_places=1, max_digits=3, null=True, verbose_name='Earned')), ('semester', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='sis.semester')), ], options={ 'ordering': ['semester', 'student'], }, ), migrations.CreateModel( name='Tasks', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('task_id', models.IntegerField()), ('task_type', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='contenttypes.contenttype')), ], ), migrations.CreateModel( name='Student', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('grad_student', models.BooleanField(default=False, verbose_name='Graduate Student')), ('gpa', models.FloatField(null=True, verbose_name='GPA')), ('credits_earned', models.DecimalField(decimal_places=1, max_digits=4, null=True, verbose_name='Earned')), ('major', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='sis.major')), ('profile', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to='sis.profile')), ('semesters', models.ManyToManyField(related_name='semester_students', through='sis.SemesterStudent', to='sis.Semester')), ], options={ 'ordering': ['profile__user__username'], }, ), migrations.AddField( model_name='semesterstudent', name='student', field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='sis.student'), ), migrations.CreateModel( name='SectionStudent', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('grade', models.SmallIntegerField(blank=True, choices=[(4, 'A'), (3, 'B'), (2, 'C'), (1, 'D'), (0, 'F')], default=None, null=True)), ('status', models.CharField(choices=[('Registered', 'Registered'), ('In Progress', 'In Progress'), ('Done', 'Done'), ('Graded', 'Graded'), ('Drop Requested', 'Drop Requested'), ('Dropped', 'Dropped')], default='Registered', max_length=20, verbose_name='Student Status')), ('section', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='sis.section')), ('student', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='sis.student')), ], options={ 'ordering': ['section', 'student'], 'unique_together': {('section', 'student')}, }, ), migrations.AddField( model_name='section', name='semester', field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='sis.semester'), ), migrations.AddField( model_name='section', name='students', field=models.ManyToManyField(related_name='section_students', through='sis.SectionStudent', to='sis.Student'), ), migrations.AddField( model_name='professor', name='profile', field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to='sis.profile'), ), migrations.CreateModel( name='Message', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('message_type', models.CharField(choices=[('generic', 'generic'), ('probation', 'probation'), ('droprequest', 'droprequest'), ('majorchange', 'majorchange'), ('sectionfilling', 'sectionfilling'), ('sectionfull', 'sectionfull'), ('sectionadded', 'sectionadded'), ('reqtranscript', 'reqtranscript'), ('transcript', 'transcript'), ('reply', 'reply')], default='generic', max_length=15)), ('time_sent', models.DateTimeField(editable=False, verbose_name='Sent at')), ('time_read', models.DateTimeField(blank=True, null=True, verbose_name='Read at')), ('time_archived', models.DateTimeField(blank=True, null=True, verbose_name='Archived at')), ('time_sender_archived', models.DateTimeField(blank=True, null=True, verbose_name='Sender Archived at')), ('time_handled', models.DateTimeField(blank=True, null=True, verbose_name='Handled at')), ('subject', models.CharField(max_length=256)), ('body', models.TextField(blank=True, null=True)), ('high_priority', models.BooleanField(default=False)), ('support_data', models.JSONField(default=dict)), ('in_response_to', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='sis.message')), ('recipient', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='sent_to', to='sis.profile', verbose_name='Recipient')), ('sender', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='sent_by', to='sis.profile', verbose_name='Sender')), ], options={ 'ordering': ['time_sent'], }, ), migrations.AddField( model_name='major', name='contact', field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='sis.profile'), ), migrations.AddField( model_name='major', name='courses_required', field=models.ManyToManyField(blank=True, related_name='required_by', to='sis.Course'), ), migrations.AddField( model_name='major', name='professors', field=models.ManyToManyField(blank=True, related_name='prof', to='sis.Professor'), ), migrations.CreateModel( name='CoursePrerequisite', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('course', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='a_course', to='sis.course')), ('prerequisite', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='a_prerequisite', to='sis.course')), ], options={ 'ordering': ['course', 'prerequisite'], 'unique_together': {('course', 'prerequisite')}, }, ), migrations.AddField( model_name='course', name='major', field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='sis.major'), ), migrations.AddField( model_name='course', name='prereqs', field=models.ManyToManyField(through='sis.CoursePrerequisite', to='sis.Course'), ), migrations.CreateModel( name='AcademicProbationTask', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('date', models.DateField(blank=True, default=None, null=True, verbose_name='Date')), ('frequency_type', models.CharField(choices=[('immediate', 'immediate'), ('interval', 'interval'), ('date', 'date')], max_length=9, verbose_name='Frequency Type')), ('title', models.CharField(blank=True, max_length=30, verbose_name='Task Title')), ('active', models.BooleanField(default=True, verbose_name='Active')), ('description', models.CharField(max_length=256, verbose_name='Description')), ('interval', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='sis.interval')), ], options={ 'abstract': False, }, ), migrations.AlterUniqueTogether( name='semesterstudent', unique_together={('semester', 'student')}, ), migrations.CreateModel( name='SectionReferenceItem', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('index', models.IntegerField(default=1, verbose_name='#')), ('item', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='sis.referenceitem')), ('section', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='sis.section')), ], options={ 'unique_together': {('section', 'item'), ('section', 'index')}, }, ), migrations.AlterUniqueTogether( name='section', unique_together={('course', 'semester', 'number')}, ), migrations.AlterUniqueTogether( name='course', unique_together={('major', 'catalog_number')}, ), ]
class AllFields(models.Model): # basics field_int = models.IntegerField() field_float = models.FloatField() field_bool = models.BooleanField() field_char = models.CharField(max_length=100) field_text = models.TextField() # special field_slug = models.SlugField() field_email = models.EmailField() field_uuid = models.UUIDField() field_url = models.URLField() if models.IPAddressField in serializers.ModelSerializer.serializer_field_mapping: field_ip = models.IPAddressField() else: field_ip = models.GenericIPAddressField(protocol='ipv6') field_ip_generic = models.GenericIPAddressField(protocol='ipv6') field_decimal = models.DecimalField(max_digits=6, decimal_places=3) field_file = models.FileField(storage=fs) field_img = models.ImageField(storage=fs) field_date = models.DateField() field_datetime = models.DateTimeField() field_bigint = models.BigIntegerField() field_smallint = models.SmallIntegerField() field_posint = models.PositiveIntegerField() field_possmallint = models.PositiveSmallIntegerField() field_nullbool = models.NullBooleanField() field_time = models.TimeField() field_duration = models.DurationField() # relations field_foreign = models.ForeignKey(Aux, on_delete=models.CASCADE, help_text='main aux object') field_m2m = models.ManyToManyField(Aux, help_text='set of related aux objects') field_o2o = models.OneToOneField(Aux, on_delete=models.CASCADE, help_text='bound aux object') # overrides field_regex = models.CharField(max_length=50) field_bool_override = models.BooleanField() if DJANGO_VERSION >= '3.1': field_json = models.JSONField() else: @property def field_json(self): return {'A': 1, 'B': 2} @property def field_model_property_float(self) -> float: return 1.337 @property def field_list(self): return [1.1, 2.2, 3.3] @property def field_list_object(self): return self.field_m2m.all() def model_function_basic(self) -> bool: return True def model_function_model(self) -> Aux: return self.field_foreign
class Migration(migrations.Migration): initial = True dependencies = [ ('utils', '0001_initial'), ('bookings', '0001_initial'), ] operations = [ migrations.CreateModel( name='AdditionalInfo', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('title', models.CharField(max_length=100)), ('description', models.CharField(max_length=200)), ], ), migrations.CreateModel( name='Category', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('parent_id', models.PositiveIntegerField()), ('name', models.CharField(max_length=50, unique=True)), ('description', models.CharField(max_length=200)), ('image', models.ImageField(blank=True, upload_to='locations/pictures')), ], ), migrations.CreateModel( name='Group', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ], ), migrations.CreateModel( name='Image', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('image_url', models.ImageField(upload_to='locations/pictures', verbose_name='Image of a location')), ('title', models.CharField(max_length=100)), ('description', models.CharField(max_length=200)), ], ), migrations.CreateModel( name='Location', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(max_length=40, verbose_name='location name')), ('description', models.TextField(max_length=2000, verbose_name='location description')), ('address', models.CharField(max_length=50, verbose_name='local address')), ('contact_email', models.EmailField(max_length=30, verbose_name='contact email')), ('price', models.FloatField(help_text='Daily cost of rent in USD', max_length=10, verbose_name='location price')), ('contact_phone', models.CharField( max_length=16, validators=[ django.core.validators.RegexValidator( message= 'Phone number must be entered in the format : +999999999. Up to 15 digits allowed.', regex='^\\+?\\d{9,15}$') ])), ('main_image', models.ImageField(null=True, upload_to='locations/pictures', verbose_name='Main picture of a location')), ('latitude', models.FloatField(max_length=20, verbose_name='latitude')), ('longitude', models.FloatField(max_length=20, verbose_name='longitude')), ('is_active', models.BooleanField( default=False, help_text='If active, can be listed for rent', verbose_name='active location')), ('has_parking', models.BooleanField(default=False, help_text='Location has parking space', verbose_name='parking')), ('has_dressing_room', models.BooleanField( default=False, help_text='Location has dressing room space', verbose_name='dressing room')), ('has_bathroom', models.BooleanField(default=False, help_text='Location has bathroom', verbose_name='bathroom')), ('has_cattering', models.BooleanField(default=False, help_text='Location has cattering space', verbose_name='cattering')), ('has_wifi', models.BooleanField(default=False, help_text='Location has wifi available', verbose_name='wifi')), ('is_verified', models.BooleanField( default=False, help_text= 'locations has to be verified before listed for rent', verbose_name='verified location')), ('categories', models.ManyToManyField(through='locations.Group', to='locations.Category')), ('city', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='utils.city')), ], ), migrations.CreateModel( name='Rating', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('rating_date', models.DateTimeField(verbose_name='Rating date')), ('accesibility', models.SmallIntegerField( default=0, verbose_name='Accesibility of location')), ('conditions', models.SmallIntegerField( default=0, verbose_name='Conditions of location')), ('average', models.SmallIntegerField( default=0, verbose_name='value for money of the location')), ('description', models.CharField( max_length=2000, null=True, verbose_name= 'Observations about the experience of the user')), ('booking_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='bookings.booking')), ('location_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='locations.location')), ], ), ]
class ReviewerScore(ModelBase): id = PositiveAutoField(primary_key=True) user = models.ForeignKey( UserProfile, related_name='_reviewer_scores', on_delete=models.CASCADE) addon = models.ForeignKey( Addon, blank=True, null=True, related_name='+', on_delete=models.CASCADE) version = models.ForeignKey( Version, blank=True, null=True, related_name='+', on_delete=models.CASCADE) score = models.IntegerField() # For automated point rewards. note_key = models.SmallIntegerField(choices=amo.REVIEWED_CHOICES.items(), default=0) # For manual point rewards with a note. note = models.CharField(max_length=255) class Meta: db_table = 'reviewer_scores' ordering = ('-created',) indexes = [ models.Index(fields=('addon',), name='reviewer_scores_addon_id_fk'), models.Index(fields=('created',), name='reviewer_scores_created_idx'), models.Index(fields=('user',), name='reviewer_scores_user_id_idx'), models.Index(fields=('version',), name='reviewer_scores_version_id'), ] @classmethod def get_key(cls, key=None, invalidate=False): namespace = 'riscore' if not key: # Assuming we're invalidating the namespace. cache_ns_key(namespace, invalidate) return else: # Using cache_ns_key so each cache val is invalidated together. ns_key = cache_ns_key(namespace, invalidate) return '%s:%s' % (ns_key, key) @classmethod def get_event(cls, addon, status, version=None, post_review=False, content_review=False): """Return the review event type constant. This is determined by the addon.type and the queue the addon is currently in (which is determined from the various parameters sent down from award_points()). Note: We're not using addon.status or addon.current_version because this is called after the status/current_version might have been updated by the reviewer action. """ reviewed_score_name = None if content_review: # Content review always gives the same amount of points. reviewed_score_name = 'REVIEWED_CONTENT_REVIEW' elif post_review: # There are 4 tiers of post-review scores depending on the addon # weight. try: if version is None: raise AutoApprovalSummary.DoesNotExist weight = version.autoapprovalsummary.weight except AutoApprovalSummary.DoesNotExist as exception: log.exception( 'No such version/auto approval summary when determining ' 'event type to award points: %r', exception) weight = 0 if addon.type == amo.ADDON_DICT: reviewed_score_name = 'REVIEWED_DICT_FULL' elif addon.type in [amo.ADDON_LPAPP, amo.ADDON_LPADDON]: reviewed_score_name = 'REVIEWED_LP_FULL' elif addon.type == amo.ADDON_SEARCH: reviewed_score_name = 'REVIEWED_SEARCH_FULL' elif weight > amo.POST_REVIEW_WEIGHT_HIGHEST_RISK: reviewed_score_name = 'REVIEWED_EXTENSION_HIGHEST_RISK' elif weight > amo.POST_REVIEW_WEIGHT_HIGH_RISK: reviewed_score_name = 'REVIEWED_EXTENSION_HIGH_RISK' elif weight > amo.POST_REVIEW_WEIGHT_MEDIUM_RISK: reviewed_score_name = 'REVIEWED_EXTENSION_MEDIUM_RISK' else: reviewed_score_name = 'REVIEWED_EXTENSION_LOW_RISK' else: if status == amo.STATUS_NOMINATED: queue = 'FULL' elif status == amo.STATUS_APPROVED: queue = 'UPDATE' else: queue = '' if (addon.type in [amo.ADDON_EXTENSION, amo.ADDON_PLUGIN, amo.ADDON_API] and queue): reviewed_score_name = 'REVIEWED_ADDON_%s' % queue elif addon.type == amo.ADDON_DICT and queue: reviewed_score_name = 'REVIEWED_DICT_%s' % queue elif addon.type in [amo.ADDON_LPAPP, amo.ADDON_LPADDON] and queue: reviewed_score_name = 'REVIEWED_LP_%s' % queue elif addon.type == amo.ADDON_STATICTHEME: reviewed_score_name = 'REVIEWED_STATICTHEME' elif addon.type == amo.ADDON_SEARCH and queue: reviewed_score_name = 'REVIEWED_SEARCH_%s' % queue if reviewed_score_name: return getattr(amo, reviewed_score_name) return None @classmethod def award_points(cls, user, addon, status, version=None, post_review=False, content_review=False, extra_note=''): """Awards points to user based on an event and the queue. `event` is one of the `REVIEWED_` keys in constants. `status` is one of the `STATUS_` keys in constants. `version` is the `Version` object that was affected by the review. `post_review` is set to True if the add-on was auto-approved and the reviewer is confirming/rejecting post-approval. `content_review` is set to True if it's a content-only review of an auto-approved add-on. """ # If a webextension file gets approved manually (e.g. because # auto-approval is disabled), 'post-review' is set to False, treating # the file as a legacy file which is not what we want. The file is # still a webextension and should treated as such, regardless of # auto-approval being disabled or not. # As a hack, we set 'post_review' to True. if (version and version.is_webextension and addon.type in amo.GROUP_TYPE_ADDON): post_review = True user_log.info( (u'Determining award points for user %s for version %s of addon %s' % (user, version, addon.id)).encode('utf-8')) event = cls.get_event( addon, status, version=version, post_review=post_review, content_review=content_review) score = amo.REVIEWED_SCORES.get(event) user_log.info( (u'Determined %s award points (event: %s) for user %s for version ' u'%s of addon %s' % (score, event, user, version, addon.id)) .encode('utf-8')) # Add bonus to reviews greater than our limit to encourage fixing # old reviews. Does not apply to content-review/post-review at the # moment, because it would need to be calculated differently. award_overdue_bonus = ( version and version.nomination and not post_review and not content_review) if award_overdue_bonus: waiting_time_days = (datetime.now() - version.nomination).days days_over = waiting_time_days - amo.REVIEWED_OVERDUE_LIMIT if days_over > 0: bonus = days_over * amo.REVIEWED_OVERDUE_BONUS score = score + bonus if score is not None: cls.objects.create(user=user, addon=addon, score=score, note_key=event, note=extra_note, version=version) cls.get_key(invalidate=True) user_log.info( (u'Awarding %s points to user %s for "%s" for addon %s' % ( score, user, amo.REVIEWED_CHOICES[event], addon.id)) .encode('utf-8')) return score @classmethod def award_moderation_points(cls, user, addon, review_id, undo=False): """Awards points to user based on moderated review.""" event = (amo.REVIEWED_ADDON_REVIEW if not undo else amo.REVIEWED_ADDON_REVIEW_POORLY) score = amo.REVIEWED_SCORES.get(event) cls.objects.create(user=user, addon=addon, score=score, note_key=event) cls.get_key(invalidate=True) user_log.info( u'Awarding %s points to user %s for "%s" for review %s' % ( score, user, amo.REVIEWED_CHOICES[event], review_id)) @classmethod def get_total(cls, user): """Returns total points by user.""" key = cls.get_key('get_total:%s' % user.id) val = cache.get(key) if val is not None: return val val = list(ReviewerScore.objects.filter(user=user) .aggregate(total=Sum('score')) .values())[0] if val is None: val = 0 cache.set(key, val, None) return val @classmethod def get_recent(cls, user, limit=5, addon_type=None): """Returns most recent ReviewerScore records.""" key = cls.get_key('get_recent:%s' % user.id) val = cache.get(key) if val is not None: return val val = ReviewerScore.objects.filter(user=user) if addon_type is not None: val.filter(addon__type=addon_type) val = list(val[:limit]) cache.set(key, val, None) return val @classmethod def get_breakdown(cls, user): """Returns points broken down by addon type.""" key = cls.get_key('get_breakdown:%s' % user.id) val = cache.get(key) if val is not None: return val sql = """ SELECT `reviewer_scores`.*, SUM(`reviewer_scores`.`score`) AS `total`, `addons`.`addontype_id` AS `atype` FROM `reviewer_scores` LEFT JOIN `addons` ON (`reviewer_scores`.`addon_id`=`addons`.`id`) WHERE `reviewer_scores`.`user_id` = %s GROUP BY `addons`.`addontype_id` ORDER BY `total` DESC """ val = list(ReviewerScore.objects.raw(sql, [user.id])) cache.set(key, val, None) return val @classmethod def get_breakdown_since(cls, user, since): """ Returns points broken down by addon type since the given datetime. """ key = cls.get_key('get_breakdown:%s:%s' % (user.id, since.isoformat())) val = cache.get(key) if val is not None: return val sql = """ SELECT `reviewer_scores`.*, SUM(`reviewer_scores`.`score`) AS `total`, `addons`.`addontype_id` AS `atype` FROM `reviewer_scores` LEFT JOIN `addons` ON (`reviewer_scores`.`addon_id`=`addons`.`id`) WHERE `reviewer_scores`.`user_id` = %s AND `reviewer_scores`.`created` >= %s GROUP BY `addons`.`addontype_id` ORDER BY `total` DESC """ val = list(ReviewerScore.objects.raw(sql, [user.id, since])) cache.set(key, val, 3600) return val @classmethod def _leaderboard_list(cls, since=None, types=None, addon_type=None): """ Returns base leaderboard list. Each item will be a tuple containing (user_id, name, total). """ reviewers = (UserProfile.objects .filter(groups__name__startswith='Reviewers: ') .exclude(groups__name__in=('Staff', 'Admins', 'No Reviewer Incentives')) .distinct()) qs = (cls.objects .values_list('user__id') .filter(user__in=reviewers) .annotate(total=Sum('score')) .order_by('-total')) if since is not None: qs = qs.filter(created__gte=since) if types is not None: qs = qs.filter(note_key__in=types) if addon_type is not None: qs = qs.filter(addon__type=addon_type) users = {reviewer.pk: reviewer for reviewer in reviewers} return [ (item[0], users.get(item[0], UserProfile()).name, item[1]) for item in qs] @classmethod def get_leaderboards(cls, user, days=7, types=None, addon_type=None): """Returns leaderboards with ranking for the past given days. This will return a dict of 3 items:: {'leader_top': [...], 'leader_near: [...], 'user_rank': (int)} If the user is not in the leaderboard, or if the user is in the top 5, 'leader_near' will be an empty list and 'leader_top' will contain 5 elements instead of the normal 3. """ key = cls.get_key('get_leaderboards:%s' % user.id) val = cache.get(key) if val is not None: return val week_ago = date.today() - timedelta(days=days) leader_top = [] leader_near = [] leaderboard = cls._leaderboard_list( since=week_ago, types=types, addon_type=addon_type) scores = [] user_rank = 0 in_leaderboard = False for rank, row in enumerate(leaderboard, 1): user_id, name, total = row scores.append({ 'user_id': user_id, 'name': name, 'rank': rank, 'total': int(total), }) if user_id == user.id: user_rank = rank in_leaderboard = True if not in_leaderboard: leader_top = scores[:5] else: if user_rank <= 5: # User is in top 5, show top 5. leader_top = scores[:5] else: leader_top = scores[:3] leader_near = [scores[user_rank - 2], scores[user_rank - 1]] try: leader_near.append(scores[user_rank]) except IndexError: pass # User is last on the leaderboard. val = { 'leader_top': leader_top, 'leader_near': leader_near, 'user_rank': user_rank, } cache.set(key, val, None) return val @classmethod def all_users_by_score(cls): """ Returns reviewers ordered by highest total points first. """ leaderboard = cls._leaderboard_list() scores = [] for row in leaderboard: user_id, name, total = row user_level = len(amo.REVIEWED_LEVELS) - 1 for i, level in enumerate(amo.REVIEWED_LEVELS): if total < level['points']: user_level = i - 1 break # Only show level if it changes. if user_level < 0: level = '' else: level = str(amo.REVIEWED_LEVELS[user_level]['name']) scores.append({ 'user_id': user_id, 'name': name, 'total': int(total), 'level': level, }) prev = None for score in reversed(scores): if score['level'] == prev: score['level'] = '' else: prev = score['level'] return scores
class Migration(migrations.Migration): initial = True dependencies = [ ('contenttypes', '0002_remove_content_type_name'), ] operations = [ migrations.CreateModel( name='Course', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(max_length=128, unique=True)), ('course_img', models.CharField(max_length=255)), ('course_type', models.SmallIntegerField(choices=[(0, '付费'), (1, 'VIP专享'), (2, '学位课程')])), ('brief', models.TextField(max_length=2048, verbose_name='课程概述')), ('level', models.SmallIntegerField(choices=[(0, '初级'), (1, '中级'), (2, '高级')], default=1)), ('pub_date', models.DateField(blank=True, null=True, verbose_name='发布日期')), ('period', models.PositiveIntegerField(default=7, verbose_name='建议学习周期(days)')), ('order', models.IntegerField(help_text='从上一个课程数字往后排', verbose_name='课程顺序')), ('attachment_path', models.CharField(blank=True, max_length=128, null=True, verbose_name='课件路径')), ('status', models.SmallIntegerField(choices=[(0, '上线'), (1, '下线'), (2, '预上线')], default=0)), ('template_id', models.SmallIntegerField(default=1, verbose_name='前端模板id')), ], options={ 'verbose_name_plural': '06.专题课或学位课模块', }, ), migrations.CreateModel( name='CourseCategory', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(max_length=64, unique=True)), ], options={ 'verbose_name_plural': '01.课程大类', }, ), migrations.CreateModel( name='CourseChapter', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('chapter', models.SmallIntegerField(default=1, verbose_name='第几章')), ('name', models.CharField(max_length=128)), ('summary', models.TextField(blank=True, null=True, verbose_name='章节介绍')), ('pub_date', models.DateField(auto_now_add=True, verbose_name='发布日期')), ('course', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='coursechapters', to='api.Course')), ], options={ 'verbose_name_plural': '10. 课程章节', }, ), migrations.CreateModel( name='CourseDetail', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('hours', models.IntegerField(verbose_name='课时')), ('course_slogan', models.CharField(blank=True, max_length=125, null=True)), ('video_brief_link', models.CharField(blank=True, max_length=255, null=True, verbose_name='课程介绍')), ('why_study', models.TextField(verbose_name='为什么学习这门课程')), ('what_to_study_brief', models.TextField(verbose_name='我将学到哪些内容')), ('career_improvement', models.TextField(verbose_name='此项目如何有助于我的职业生涯')), ('prerequisite', models.TextField(max_length=1024, verbose_name='课程先修要求')), ('course', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to='api.Course')), ('recommend_courses', models.ManyToManyField(blank=True, related_name='recommend_by', to='api.Course')), ], options={ 'verbose_name_plural': '07.课程或学位模块详细', }, ), migrations.CreateModel( name='CourseOutline', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('title', models.CharField(max_length=128)), ('order', models.PositiveSmallIntegerField(default=1)), ('content', models.TextField(max_length=2048, verbose_name='内容')), ('course_detail', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='api.CourseDetail')), ], options={ 'verbose_name_plural': '09. 课程大纲', }, ), migrations.CreateModel( name='CourseSection', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(max_length=128)), ('order', models.PositiveSmallIntegerField(help_text='建议每个课时之间空1至2个值,以备后续插入课时', verbose_name='课时排序')), ('section_type', models.SmallIntegerField(choices=[(0, '文档'), (1, '练习'), (2, '视频')], default=2)), ('section_link', models.CharField(blank=True, help_text='若是video,填vid,若是文档,填link', max_length=255, null=True)), ('video_time', models.CharField(blank=True, max_length=32, null=True, verbose_name='视频时长')), ('pub_date', models.DateTimeField(auto_now_add=True, verbose_name='发布时间')), ('free_trail', models.BooleanField(default=False, verbose_name='是否可试看')), ('chapter', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='coursesections', to='api.CourseChapter')), ], options={ 'verbose_name_plural': '11. 课时', }, ), migrations.CreateModel( name='CourseSubCategory', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(max_length=64, unique=True)), ('category', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='api.CourseCategory')), ], options={ 'verbose_name_plural': '02.课程子类', }, ), migrations.CreateModel( name='DegreeCourse', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(max_length=128, unique=True)), ('course_img', models.CharField(max_length=255, verbose_name='缩略图')), ('brief', models.TextField(verbose_name='学位课程简介')), ('total_scholarship', models.PositiveIntegerField(default=40000, verbose_name='总奖学金(贝里)')), ('mentor_compensation_bonus', models.PositiveIntegerField(default=15000, verbose_name='本课程的导师辅导费用(贝里)')), ('period', models.PositiveIntegerField(default=150, verbose_name='建议学习周期(days)')), ('prerequisite', models.TextField(max_length=1024, verbose_name='课程先修要求')), ], options={ 'verbose_name_plural': '03.学位课', }, ), migrations.CreateModel( name='Homework', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('title', models.CharField(max_length=128, verbose_name='作业题目')), ('order', models.PositiveSmallIntegerField(help_text='同一课程的每个作业之前的order值间隔1-2个数', verbose_name='作业顺序')), ('homework_type', models.SmallIntegerField(choices=[(0, '作业'), (1, '模块通关考核')], default=0)), ('requirement', models.TextField(max_length=1024, verbose_name='作业需求')), ('threshold', models.TextField(max_length=1024, verbose_name='踩分点')), ('recommend_period', models.PositiveSmallIntegerField(default=7, verbose_name='推荐完成周期(天)')), ('scholarship_value', models.PositiveSmallIntegerField(verbose_name='为该作业分配的奖学金(贝里)')), ('note', models.TextField(blank=True, null=True)), ('enabled', models.BooleanField(default=True, help_text='本作业如果后期不需要了,不想让学员看到,可以设置为False')), ('chapter', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='api.CourseChapter')), ], options={ 'verbose_name_plural': '12. 章节作业', }, ), migrations.CreateModel( name='OftenAskedQuestion', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('object_id', models.PositiveIntegerField()), ('question', models.CharField(max_length=255)), ('answer', models.TextField(max_length=1024)), ('content_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='contenttypes.ContentType')), ], options={ 'verbose_name_plural': '08. 常见问题', }, ), migrations.CreateModel( name='PricePolicy', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('object_id', models.PositiveIntegerField()), ('valid_period', models.SmallIntegerField(choices=[(1, '1天'), (3, '3天'), (7, '1周'), (14, '2周'), (30, '1个月'), (60, '2个月'), (90, '3个月'), (180, '6个月'), (210, '12个月'), (540, '18个月'), (720, '24个月')])), ('price', models.FloatField()), ('content_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='contenttypes.ContentType')), ], options={ 'verbose_name_plural': '15. 价格策略', }, ), migrations.CreateModel( name='Scholarship', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('time_percent', models.PositiveSmallIntegerField(help_text='只填百分值,如80,代表80%', verbose_name='奖励档位(时间百分比)')), ('value', models.PositiveIntegerField(verbose_name='奖学金数额')), ('degree_course', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='api.DegreeCourse')), ], options={ 'verbose_name_plural': '05.学位课奖学金', }, ), migrations.CreateModel( name='Teacher', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(max_length=32)), ('role', models.SmallIntegerField(choices=[(0, '讲师'), (1, '导师')], default=0)), ('title', models.CharField(max_length=64, verbose_name='职位、职称')), ('signature', models.CharField(blank=True, help_text='导师签名', max_length=255, null=True)), ('image', models.CharField(max_length=128)), ('brief', models.TextField(max_length=1024)), ], options={ 'verbose_name_plural': '04.导师或讲师', }, ), migrations.AddField( model_name='degreecourse', name='teachers', field=models.ManyToManyField(to='api.Teacher', verbose_name='课程讲师'), ), migrations.AddField( model_name='coursedetail', name='teachers', field=models.ManyToManyField(to='api.Teacher', verbose_name='课程讲师'), ), migrations.AddField( model_name='course', name='degree_course', field=models.ForeignKey(blank=True, help_text='若是学位课程,此处关联学位表', null=True, on_delete=django.db.models.deletion.CASCADE, to='api.DegreeCourse'), ), migrations.AddField( model_name='course', name='sub_category', field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='api.CourseSubCategory'), ), migrations.AlterUniqueTogether( name='pricepolicy', unique_together=set([('content_type', 'object_id', 'valid_period')]), ), migrations.AlterUniqueTogether( name='oftenaskedquestion', unique_together=set([('content_type', 'object_id', 'question')]), ), migrations.AlterUniqueTogether( name='homework', unique_together=set([('chapter', 'title')]), ), migrations.AlterUniqueTogether( name='coursesection', unique_together=set([('chapter', 'section_link')]), ), migrations.AlterUniqueTogether( name='courseoutline', unique_together=set([('course_detail', 'title')]), ), migrations.AlterUniqueTogether( name='coursechapter', unique_together=set([('course', 'chapter')]), ), ]
class Migration(migrations.Migration): initial = True dependencies = [ migrations.swappable_dependency(settings.AUTH_USER_MODEL), ] operations = [ migrations.CreateModel( name='MetaInstall', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('installed_example', models.BooleanField(default=False)), ], ), migrations.CreateModel( name='QueryHistory', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('query', models.TextField()), ('last_state', models.IntegerField(db_index=True)), ('has_results', models.BooleanField(default=False)), ('submission_date', models.DateTimeField(auto_now_add=True)), ('server_id', models.CharField(max_length=1024, null=True)), ('server_guid', models.CharField(default=None, max_length=1024, null=True)), ('statement_number', models.SmallIntegerField(default=0)), ('operation_type', models.SmallIntegerField(null=True)), ('modified_row_count', models.FloatField(null=True)), ('log_context', models.CharField(max_length=1024, null=True)), ('server_host', models.CharField(default='', help_text='Host of the query server.', max_length=128)), ('server_port', models.PositiveIntegerField( default=10000, help_text='Port of the query server.')), ('server_name', models.CharField(default='', help_text='Name of the query server.', max_length=128)), ('server_type', models.CharField(choices=[('beeswax', 'Beeswax'), ('hiveserver2', 'Hive Server 2'), ('mysql', 'MySQL'), ('postgresql', 'PostgreSQL'), ('sqlite', 'sqlite'), ('oracle', 'oracle')], default='beeswax', help_text='Type of the query server.', max_length=128)), ('query_type', models.SmallIntegerField(choices=[(0, 'HQL'), (1, 'IMPALA')], default=0, help_text='Type of the query.')), ('notify', models.BooleanField(default=False)), ('is_redacted', models.BooleanField(default=False)), ('extra', models.TextField(default='{}')), ('is_cleared', models.BooleanField(default=False)), ], options={ 'ordering': ['-submission_date'], }, ), migrations.CreateModel( name='SavedQuery', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('type', models.IntegerField()), ('data', models.TextField(max_length=65536)), ('name', models.CharField(max_length=80)), ('desc', models.TextField(max_length=1024)), ('mtime', models.DateTimeField(auto_now=True)), ('is_auto', models.BooleanField(db_index=True, default=False)), ('is_trashed', models.BooleanField(db_index=True, default=False, help_text='If this query is trashed.', verbose_name='Is trashed')), ('is_redacted', models.BooleanField(default=False)), ('owner', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), ], options={ 'ordering': ['-mtime'], }, ), migrations.CreateModel( name='Session', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('status_code', models.PositiveSmallIntegerField()), ('secret', models.TextField(max_length=100)), ('guid', models.TextField(max_length=100)), ('server_protocol_version', models.SmallIntegerField(default=0)), ('last_used', models.DateTimeField(auto_now=True, db_index=True, verbose_name='Last used')), ('application', models.CharField(default='beeswax', help_text='Application we communicate with.', max_length=128)), ('properties', models.TextField(default='{}')), ('owner', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), ], ), migrations.AddField( model_name='queryhistory', name='design', field=models.ForeignKey( null=True, on_delete=django.db.models.deletion.CASCADE, to='beeswax.SavedQuery'), ), migrations.AddField( model_name='queryhistory', name='owner', field=models.ForeignKey( on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), ), migrations.CreateModel( name='HiveServerQueryHistory', fields=[], options={ 'proxy': True, 'indexes': [], }, bases=('beeswax.queryhistory', ), ), ]
class Migration(migrations.Migration): initial = True dependencies = [ migrations.swappable_dependency(settings.AUTH_USER_MODEL), ] operations = [ migrations.CreateModel( name='Agency', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(max_length=100)), ], ), migrations.CreateModel( name='Artist', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('firstname', models.CharField(max_length=60)), ('lastname', models.CharField(max_length=60)), ('agency', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='PID.Agency')), ], ), migrations.CreateModel( name='ArtisteType', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('artistId', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='PID.Artist')), ], ), migrations.CreateModel( name='ArtisteTypeShow', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('artisteTypeId', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='PID.ArtisteType')), ], ), migrations.CreateModel( name='Category', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('type', models.CharField(max_length=10)), ], ), migrations.CreateModel( name='Localitie', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ], ), migrations.CreateModel( name='Location', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('designation', models.CharField(max_length=60)), ('address', models.CharField(max_length=60)), ('website', models.CharField(max_length=255)), ('phone', models.CharField(max_length=30)), ('localityId', models.OneToOneField( on_delete=django.db.models.deletion.CASCADE, to='PID.Localitie')), ], ), migrations.CreateModel( name='Profile', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('language', models.CharField(max_length=60)), ('user', models.OneToOneField( on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), ], ), migrations.CreateModel( name='Representation', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('locationId', models.ManyToManyField(blank=True, related_name='representation', to='PID.Location')), ], ), migrations.CreateModel( name='RepresentationUser', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('places', models.IntegerField()), ('representationId', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='PID.Representation')), ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), ], ), migrations.CreateModel( name='Show', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('title', models.CharField(max_length=255)), ('posterUrl', models.CharField(max_length=255)), ('price', models.DecimalField(decimal_places=2, max_digits=10)), ('bookable', models.SmallIntegerField()), ('category', models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, to='PID.Category')), ('location_id', models.ManyToManyField(blank=True, related_name='show', to='PID.Location')), ], ), migrations.CreateModel( name='Type', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('type', models.CharField(max_length=60)), ], ), migrations.AddField( model_name='representation', name='showId', field=models.ManyToManyField(blank=True, related_name='representation', to='PID.Show'), ), migrations.AddField( model_name='artistetypeshow', name='showId', field=models.ForeignKey( on_delete=django.db.models.deletion.CASCADE, to='PID.Show'), ), migrations.AddField( model_name='artistetype', name='typeId', field=models.ForeignKey( on_delete=django.db.models.deletion.CASCADE, to='PID.Type'), ), ]
class Migration(migrations.Migration): initial = True dependencies = [ migrations.swappable_dependency(settings.AUTH_USER_MODEL), ] operations = [ migrations.CreateModel( name='Author', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('user', models.OneToOneField( on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), ], ), migrations.CreateModel( name='Category', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('cat_name', models.CharField( help_text= "please don't use any symbols and only lowercase letters allowed", max_length=150)), ], options={ 'ordering': ['cat_name'], }, ), migrations.CreateModel( name='Comment', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('time', models.DateTimeField(auto_now_add=True)), ('comm', models.TextField()), ], ), migrations.CreateModel( name='Contact', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('username', models.CharField(max_length=100)), ('email', models.EmailField(max_length=254)), ('message', models.TextField()), ('time', models.DateTimeField(auto_now_add=True)), ], ), migrations.CreateModel( name='Post', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('title', models.CharField(max_length=255)), ('overview', models.TextField(blank=True, null=True)), ('slug', models.SlugField(blank=True, max_length=255, null=True)), ('body', ckeditor_uploader.fields.RichTextUploadingField(null=True)), ('time_upload', models.DateTimeField(auto_now_add=True)), ('thumbnail', models.ImageField(upload_to='thumbnails')), ('publish', models.BooleanField()), ('read', models.IntegerField(default=0)), ('author', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='Blogapp.author')), ('category', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='Blogapp.category')), ('favourite', models.ManyToManyField(blank=True, related_name='favourite', to=settings.AUTH_USER_MODEL)), ('likes', models.ManyToManyField(blank=True, related_name='likes', to=settings.AUTH_USER_MODEL)), ], options={ 'ordering': ['-pk'], }, ), migrations.CreateModel( name='Subscribe', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('email', models.EmailField(max_length=254)), ], options={ 'ordering': ['-pk'], }, ), migrations.CreateModel( name='UserOTP', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('time_st', models.DateTimeField(auto_now=True)), ('otp', models.SmallIntegerField()), ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), ], ), migrations.CreateModel( name='SubComment', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('time', models.DateTimeField(auto_now_add=True)), ('comm', models.TextField()), ('comment', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='Blogapp.comment')), ('post', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='Blogapp.post')), ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), ], ), migrations.CreateModel( name='Profile', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('dob', models.DateField( blank=True, help_text= 'Please use the following format: <em>YYYY-MM-DD</em>.', null=True)), ('photo', models.ImageField(blank=True, null=True, upload_to='user_profiles')), ('user', models.OneToOneField( on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), ], ), migrations.AddField( model_name='comment', name='post', field=models.ForeignKey( on_delete=django.db.models.deletion.CASCADE, to='Blogapp.post'), ), migrations.AddField( model_name='comment', name='user', field=models.ForeignKey( on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), ), ]
class Migration(migrations.Migration): initial = True dependencies = [ ] operations = [ migrations.CreateModel( name='admin', fields=[ ('adminId', models.AutoField(primary_key=True, serialize=False)), ('adminname', models.CharField(max_length=50)), ('password', models.CharField(default='', max_length=20)), ('email', models.CharField(default='', max_length=100)), ], ), migrations.CreateModel( name='article', fields=[ ('articleId', models.AutoField(primary_key=True, serialize=False)), ('browserNum', models.IntegerField()), ('articleStatus', models.IntegerField()), ('heading', models.CharField(max_length=250)), ('thumb', models.CharField(max_length=250)), ('modifydate', models.DateTimeField(auto_now=True)), ('adminId', models.ForeignKey(on_delete=None, to='server.admin')), ], ), migrations.CreateModel( name='menu', fields=[ ('menuId', models.AutoField(primary_key=True, serialize=False)), ('menuName', models.CharField(max_length=200)), ('menuStatus', models.SmallIntegerField(default=0)), ], ), migrations.CreateModel( name='position', fields=[ ('positionId', models.AutoField(primary_key=True, serialize=False)), ('name', models.CharField(max_length=100)), ], ), migrations.CreateModel( name='position_content', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('positionId', models.IntegerField()), ('articleId', models.IntegerField()), ], ), migrations.CreateModel( name='source', fields=[ ('sourceId', models.AutoField(primary_key=True, serialize=False)), ('sourceName', models.CharField(max_length=200)), ], ), migrations.CreateModel( name='articlecontent', fields=[ ('contentId', models.AutoField(primary_key=True, serialize=False)), ('contents', DjangoUeditor.models.UEditorField()), ('articleId', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='server.article')), ], ), migrations.AddField( model_name='article', name='menuId', field=models.ForeignKey(on_delete=None, to='server.menu'), ), migrations.AddField( model_name='article', name='sourceId', field=models.ForeignKey(on_delete=None, to='server.source'), ), ]
class ProvinceDataRecord(models.Model): province = models.ForeignKey( to=Province, null=False, blank=False, on_delete=models.CASCADE, verbose_name='省份', related_name='data_record_ls') year = models.IntegerField(verbose_name='年度', null=False, blank=False) # 基础值 r_d = models.FloatField(verbose_name='企业 R&D 内部经费支出(亿元)', null=False, blank=False, validators=[can_not_equal_zero]) renewable_energy_per = models.FloatField(verbose_name='可再生能源供给占比(%)', null=False, blank=False, validators=[can_not_equal_zero]) per_unit_gdp = models.FloatField(verbose_name='单位GDP能耗(吨/万元)', null=False, blank=False, validators=[can_not_equal_zero]) rural_urban = models.FloatField(verbose_name='乡-城人均年收入比(/)', null=False, blank=False, validators=[can_not_equal_zero]) urban_per = models.FloatField(verbose_name='城镇居民人均可支配收入(元)', null=False, blank=False, validators=[can_not_equal_zero]) rural_per = models.FloatField(verbose_name='农村居民人均可支配收入(元)', null=False, blank=False, validators=[can_not_equal_zero]) garbage = models.FloatField(verbose_name='生活垃圾无害化处理率(%)', null=False, blank=False, validators=[can_not_equal_zero]) bus_per = models.FloatField(verbose_name='平均万人拥有公共汽车(/)', null=False, blank=False, validators=[can_not_equal_zero]) urban_sewage = models.FloatField(verbose_name='城镇生活污水集中处理率(%)', null=False, blank=False, validators=[can_not_equal_zero]) edu_years = models.FloatField(verbose_name='平均受教育年限(年)', null=False, blank=False, validators=[can_not_equal_zero]) mortality = models.FloatField(verbose_name='死亡率(%)', null=False, blank=False, validators=[can_not_equal_zero]) pension_cov = models.FloatField(verbose_name='养老保险覆盖率(%)', null=False, blank=False, validators=[can_not_equal_zero]) medical_cov = models.FloatField(verbose_name='医疗保险覆盖率(%)', null=False, blank=False, validators=[can_not_equal_zero]) unemployment_cov = models.FloatField(verbose_name='失业保险覆盖率(%)', null=False, blank=False, validators=[can_not_equal_zero]) pm25 = models.FloatField(verbose_name='PM2.5年平均浓度(微克/立方米)', null=False, blank=False, validators=[can_not_equal_zero]) so2_emissions = models.FloatField(verbose_name='二氧化硫排放量(万吨)', null=False, blank=False, validators=[can_not_equal_zero]) co2_per_gdp = models.FloatField(verbose_name='单位GDP二氧化碳排放量(千克/元)', null=False, blank=False, validators=[can_not_equal_zero]) cod_emissions = models.FloatField(verbose_name='化学需氧量排放量(万吨)', null=False, blank=False, validators=[can_not_equal_zero]) nh_emissions = models.FloatField(verbose_name='氨氮排放量(万吨)', null=False, blank=False, validators=[can_not_equal_zero]) water_per = models.FloatField(verbose_name='人均耗水量(立方米)', null=False, blank=False, validators=[can_not_equal_zero]) water_per_gdp = models.FloatField(verbose_name='单位GDP用水量(立方米/万元)', null=False, blank=False, validators=[can_not_equal_zero]) planting_area = models.FloatField(verbose_name='播种面积占比(%)', null=False, blank=False, validators=[can_not_equal_zero]) ef_per = models.FloatField(verbose_name='人均生态足迹(万吨碳/万人)', null=False, blank=False, validators=[can_not_equal_zero]) # 目标值 r_d_target = models.FloatField(verbose_name='企业 R&D 内部经费支出的目标值', null=False, blank=False, validators=[can_not_equal_zero]) renewable_energy_per_target = models.FloatField(verbose_name='可再生能源供给占比的目标值', null=False, blank=False, validators=[can_not_equal_zero]) per_unit_gdp_target = models.FloatField(verbose_name='单位GDP能耗的目标值', null=False, blank=False, validators=[can_not_equal_zero]) rural_urban_target = models.FloatField(verbose_name='乡-城人均年收入比的目标值', null=False, blank=False, validators=[can_not_equal_zero]) urban_per_target = models.FloatField(verbose_name='城镇居民人均可支配收入的目标值', null=False, blank=False, validators=[can_not_equal_zero]) rural_per_target = models.FloatField(verbose_name='农村居民人均可支配收入的目标值', null=False, blank=False, validators=[can_not_equal_zero]) garbage_target = models.FloatField(verbose_name='生活垃圾无害化处理率的目标值', null=False, blank=False, validators=[can_not_equal_zero]) bus_per_target = models.FloatField(verbose_name='平均万人拥有公共汽车的目标值', null=False, blank=False, validators=[can_not_equal_zero]) urban_sewage_target = models.FloatField(verbose_name='城镇生活污水集中处理率的目标值', null=False, blank=False, validators=[can_not_equal_zero]) edu_years_target = models.FloatField(verbose_name='平均受教育年限的目标值', null=False, blank=False, validators=[can_not_equal_zero]) mortality_target = models.FloatField(verbose_name='死亡率的目标值', null=False, blank=False, validators=[can_not_equal_zero]) pension_cov_target = models.FloatField(verbose_name='养老保险覆盖率的目标值', null=False, blank=False, validators=[can_not_equal_zero]) medical_cov_target = models.FloatField(verbose_name='医疗保险覆盖率的目标值', null=False, blank=False, validators=[can_not_equal_zero]) unemployment_cov_target = models.FloatField(verbose_name='失业保险覆盖率的目标值', null=False, blank=False, validators=[can_not_equal_zero]) pm25_target = models.FloatField(verbose_name='PM2.5年平均浓度的目标值', null=False, blank=False, validators=[can_not_equal_zero]) so2_emissions_target = models.FloatField(verbose_name='二氧化硫排放量的目标值', null=False, blank=False, validators=[can_not_equal_zero]) co2_per_gdp_target = models.FloatField(verbose_name='单位GDP二氧化碳排放量的目标值', null=False, blank=False, validators=[can_not_equal_zero]) cod_emissions_target = models.FloatField(verbose_name='化学需氧量排放量的目标值', null=False, blank=False, validators=[can_not_equal_zero]) nh_emissions_target = models.FloatField(verbose_name='氨氮排放量的目标值', null=False, blank=False, validators=[can_not_equal_zero]) water_per_target = models.FloatField(verbose_name='人均耗水量的目标值', null=False, blank=False, validators=[can_not_equal_zero]) water_per_gdp_target = models.FloatField(verbose_name='单位GDP用水量的目标值', null=False, blank=False, validators=[can_not_equal_zero]) planting_area_target = models.FloatField(verbose_name='播种面积占比的目标值', null=False, blank=False, validators=[can_not_equal_zero]) ef_per_target = models.FloatField(verbose_name='人均生态足迹的目标值', null=False, blank=False, validators=[can_not_equal_zero]) # # attach # # attach = models.FileField( # verbose_name='年度省内各地区数据', upload_to='data/%Y-%m-%d', default='data/数据模板.xlsx', # validators=[ # FileExtensionValidator(allowed_extensions=('xlsx',), message='仅支持上传扩展名为 xlsx 的Excel文件'), # import_excel_validator, # ], # ) # 后续计算 green_innovation = models.FloatField(verbose_name='绿色创新', null=True, blank=True) renewable_energy = models.FloatField(verbose_name='可再生能源供给', null=True, blank=True, validators=[can_not_equal_zero]) energy_use = models.FloatField(verbose_name='能源利用', null=True, blank=True) parma_ratio = models.FloatField(verbose_name='帕尔玛比率', null=True, blank=True) income = models.FloatField(verbose_name='收入', null=True, blank=True) infrastructure = models.FloatField(verbose_name='基础设施建设', null=True, blank=True) education = models.FloatField(verbose_name='教育', null=True, blank=True) life_expectancy = models.FloatField(verbose_name='预期寿命', null=True, blank=True) social_security = models.FloatField(verbose_name='社会保障', null=True, blank=True) air_pollution = models.FloatField(verbose_name='大气污染', null=True, blank=True) greenhouse = models.FloatField(verbose_name='温室气体排放', null=True, blank=True) nitrogen = models.FloatField(verbose_name='氮排放', null=True, blank=True) water_withdrawal = models.FloatField(verbose_name='取水量', null=True, blank=True) land_use = models.FloatField(verbose_name='土地利用', null=True, blank=True) EF = models.FloatField(verbose_name='生态足迹', null=True, blank=True) city_green_economy = models.FloatField(verbose_name='绿色经济', null=True, blank=True) city_sustainable = models.FloatField(verbose_name='可持续发展', null=True, blank=True) city_gep_plus = models.FloatField(verbose_name='GEP+', null=True, blank=True) # 1 新上传 2 excel 地区数据解析入库成功 3 计算中 4 计算失败 5 计算成功 6 更新数据需要重新计算 status = models.SmallIntegerField(verbose_name='状态', default=1, ) class Meta: ordering = '-year', 'province' verbose_name = '省份数据' verbose_name_plural = verbose_name def __str__(self): return f'{self.province.name},{self.year}'
class Migration(migrations.Migration): initial = True dependencies = [] operations = [ migrations.CreateModel( name='Actor', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(max_length=100, verbose_name='Имя')), ('age', models.PositiveSmallIntegerField(default=0, verbose_name='Возраст')), ('description', models.TextField(verbose_name='Описание')), ('image', models.ImageField(upload_to='actors/', verbose_name='Изображение')), ], options={ 'verbose_name': 'Актеры и режессеры', 'verbose_name_plural': 'Актеры и режессеры', }, ), migrations.CreateModel( name='Category', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(max_length=150, verbose_name='Категория')), ('description', models.TextField(verbose_name='Описание')), ('url', models.SlugField(max_length=160, unique=True)), ], options={ 'verbose_name': 'Категория', 'verbose_name_plural': 'Категории', }, ), migrations.CreateModel( name='Genre', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(max_length=100, verbose_name='Имя')), ('description', models.TextField(verbose_name='Описание')), ('url', models.SlugField(max_length=160, unique=True)), ], options={ 'verbose_name': 'Жанр', 'verbose_name_plural': 'Жанры', }, ), migrations.CreateModel( name='Movie', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('title', models.CharField(max_length=100, verbose_name='Название')), ('tagline', models.CharField(default='', max_length=100, verbose_name='Слоган')), ('description', models.TextField(verbose_name='Описание')), ('poster', models.ImageField(upload_to='movies/', verbose_name='Постер')), ('year', models.PositiveSmallIntegerField(default=2019, verbose_name='Дата выхода')), ('country', models.CharField(max_length=30, verbose_name='')), ('world_premiere', models.DateField(default=datetime.date.today, verbose_name='Примьера в мире')), ('budget', models.PositiveIntegerField( default=0, help_text='Указывать сумму в долларах', verbose_name='Бюджет')), ('fees_in_usa', models.PositiveIntegerField( default=0, help_text='Указывать сумму в долларах', verbose_name='Сборы в США')), ('fees_in_world', models.PositiveIntegerField( default=0, help_text='Указывать сумму в долларах', verbose_name='Сборы в мире')), ('url', models.SlugField(max_length=130, unique=True)), ('draft', models.BooleanField(default=False, verbose_name='Черновик')), ('actors', models.ManyToManyField(related_name='film_actor', to='movies.Actor', verbose_name='актеры')), ('category', models.ForeignKey( null=True, on_delete=django.db.models.deletion.SET_NULL, to='movies.category', verbose_name='Категория')), ('directors', models.ManyToManyField(related_name='film_director', to='movies.Actor', verbose_name='режиссер')), ('genres', models.ManyToManyField(to='movies.Genre', verbose_name='жанры')), ], options={ 'verbose_name': 'Фильм', 'verbose_name_plural': 'Фильмы', }, ), migrations.CreateModel( name='RatingStar', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('value', models.SmallIntegerField(default=0, verbose_name='Значение')), ], options={ 'verbose_name': 'Звезда рейтинга', 'verbose_name_plural': 'Звезды рейтинга', }, ), migrations.CreateModel( name='Reviews', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('email', models.EmailField(max_length=254)), ('name', models.CharField(max_length=100, verbose_name='')), ('text', models.TextField(max_length=5000, verbose_name='')), ('movie', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='movies.movie', verbose_name='')), ('parent', models.ForeignKey( blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='movies.reviews', verbose_name='')), ], options={ 'verbose_name': 'Отзыв', 'verbose_name_plural': 'Отзывы', }, ), migrations.CreateModel( name='Rating', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('ip', models.CharField(max_length=15, verbose_name='IP address')), ('movie', models.ForeignKey(on_delete=django.db.models.fields.CharField, to='movies.movie', verbose_name='фильм')), ('star', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='movies.ratingstar', verbose_name='звезда')), ], options={ 'verbose_name': 'Рейтинг', 'verbose_name_plural': 'Рейтинги', }, ), migrations.CreateModel( name='MovieShots', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('title', models.CharField(max_length=100, verbose_name='Заголовок')), ('description', models.TextField(verbose_name='Описание')), ('image', models.ImageField(upload_to='movie_shots/', verbose_name='Изображение')), ('movie', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='movies.movie', verbose_name='Фильм')), ], options={ 'verbose_name': 'Кадр из фильма', 'verbose_name_plural': 'Кадры из фильма', }, ), ]
class Migration(migrations.Migration): initial = True dependencies = [ ('accounts', '0001_initial'), ('mall', '0001_initial'), ] operations = [ migrations.CreateModel( name='Cart', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(max_length=128, verbose_name='商品名称')), ('img', models.ImageField(upload_to='', verbose_name='商品的主图')), ('price', models.IntegerField(verbose_name='兑换价格')), ('origin_price', models.FloatField(verbose_name='原价')), ('count', models.PositiveIntegerField(verbose_name='购买数量')), ('amount', models.FloatField(verbose_name='总额')), ('status', models.SmallIntegerField(choices=[(10, '购物车'), (11, '已提交'), (12, '已支付'), (13, '已发货'), (14, '已发货'), (15, '已删除')], default=10, verbose_name='状态')), ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), ('updated_at', models.DateTimeField(auto_now=True, verbose_name='修改时间')), ], options={ 'db_table': 'mine_cart', }, ), migrations.CreateModel( name='Comments', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('desc', models.CharField(max_length=256, verbose_name='评价内容')), ('reorder', models.SmallIntegerField(default=0, verbose_name='排序')), ('is_anonymous', models.BooleanField(default=True, verbose_name='是否匿名')), ('score', models.FloatField(default=10.0, verbose_name='商品评分')), ('score_deliver', models.FloatField(default=10.0, verbose_name='配送服务分')), ('score_package', models.FloatField(default=10.0, verbose_name='快递包装分')), ('score_speed', models.FloatField(default=10.0, verbose_name='送货速度分')), ('is_valid', models.BooleanField(default=True, verbose_name='是否有效')), ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), ('updated_at', models.DateTimeField(auto_now=True, verbose_name='修改时间')), ], options={ 'db_table': 'mine_product_comments', }, ), migrations.CreateModel( name='Order', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('sn', models.CharField(max_length=32, verbose_name='订单编号')), ('buy_count', models.IntegerField(default=1, verbose_name='购买数量')), ('buy_amount', models.FloatField(verbose_name='总价')), ('to_user', models.CharField(max_length=32, verbose_name='收货人')), ('to_area', models.CharField(max_length=32, verbose_name='省市区')), ('to_address', models.CharField(max_length=256, verbose_name='详细地址')), ('to_phone', models.CharField(max_length=32, verbose_name='手机号码')), ('remark', models.CharField(blank=True, max_length=255, null=True, verbose_name='备注')), ('express_type', models.CharField(blank=True, max_length=32, null=True, verbose_name='快递')), ('express_no', models.CharField(blank=True, max_length=32, null=True, verbose_name='单号')), ('status', models.SmallIntegerField(choices=[(10, '购物车'), (11, '已提交'), (12, '已支付'), (13, '已发货'), (14, '已发货'), (15, '已删除')], default=11, verbose_name='订单状态')), ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='orders', to='accounts.User')), ], options={ 'db_table': 'mine_order', }, ), migrations.AddField( model_name='comments', name='order', field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='comments', to='mine.Order', verbose_name='订单'), ), migrations.AddField( model_name='comments', name='product', field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='comments', to='mall.Product', verbose_name='商品'), ), migrations.AddField( model_name='comments', name='user', field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='comments', to='accounts.User', verbose_name='用户'), ), migrations.AddField( model_name='cart', name='order', field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='mine.Order', verbose_name='订单'), ), migrations.AddField( model_name='cart', name='product', field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='mall.Product'), ), migrations.AddField( model_name='cart', name='user', field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='carts', to='accounts.User'), ), ]