from django.db import models from django.contrib.auth.models import User from django.core.validators import RegexValidator from django.conf import settings from django.utils import timezone from django.core.files import File from taggit.managers import TaggableManager from simple_history.models import HistoricalRecords from os import path, sep import tempfile import subprocess position_choices = ( ("contributor", "Contributor"), ("reviewer", "Reviewer") ) department_choices = ( ("computer", "Computers"), ("mathematics", "Mathematics"), ("physics", "Physics"), ("information technology", "Information Technology"), ("civil", "Civil"), ("electrical", "Electrical"), ("mechanical", "Mechanical"), ("chemical", "Chemical"), ("aerospace", "Aerospace"), ("biosciences and bioengineering", "Biosciences and BioEngineering"), ("electronics", "Electronics"), ("energy science and engineering", "Energy Science and Engineering"), ("others", "Others") ) title = ( ("Professor", "Prof."), ("Doctor", "Dr."), ("Shriman", "Shri"), ("Shrimati", "Smt"), ("Kumari", "Ku"), ("Mr", "Mr."), ("Mrs", "Mrs."), ("Miss", "Ms."), ) source = ( ("FOSSEE website", "FOSSEE website"), ("Google", "Google"), ("Social Media", "Social Media"), ("From other College", "From other College"), ("others", "Others") ) states = ( ("IN-AP", "Andhra Pradesh"), ("IN-AR", "Arunachal Pradesh"), ("IN-AS", "Assam"), ("IN-BR", "Bihar"), ("IN-CT", "Chhattisgarh"), ("IN-GA", "Goa"), ("IN-GJ", "Gujarat"), ("IN-HR", "Haryana"), ("IN-HP", "Himachal Pradesh"), ("IN-JK", "Jammu and Kashmir"), ("IN-JH", "Jharkhand"), ("IN-KA", "Karnataka"), ("IN-KL", "Kerala"), ("IN-MP", "Madhya Pradesh"), ("IN-MH", "Maharashtra"), ("IN-MN", "Manipur"), ("IN-ML", "Meghalaya"), ("IN-MZ", "Mizoram"), ("IN-NL", "Nagaland"), ("IN-OR", "Odisha"), ("IN-PB", "Punjab"), ("IN-RJ", "Rajasthan"), ("IN-SK", "Sikkim"), ("IN-TN", "Tamil Nadu"), ("IN-TG", "Telangana"), ("IN-TR", "Tripura"), ("IN-UT", "Uttarakhand"), ("IN-UP", "Uttar Pradesh"), ("IN-WB", "West Bengal"), ("IN-AN", "Andaman and Nicobar Islands"), ("IN-CH", "Chandigarh"), ("IN-DN", "Dadra and Nagar Haveli"), ("IN-DD", "Daman and Diu"), ("IN-DL", "Delhi"), ("IN-LD", "Lakshadweep"), ("IN-PY", "Puducherry") ) status = ( ("pending", "Pending Acceptance"), ("rejected", "Rejected"), ("changes", "Changes Required"), ("released", "Released") ) def has_profile(user): """ check if user has profile """ return True if hasattr(user, 'profile') else False def attachments(instance, filename): return path.join(instance.animation.category.name, instance.animation.title, str(instance.animation.id), filename) def validate_file_extension(value): import os from django.core.exceptions import ValidationError ext = os.path.splitext(value.name)[1] # [0] returns path+filename valid_extensions = ['.mp4'] if not ext.lower() in valid_extensions: raise ValidationError(u'Unsupported file extension.') def validate_img_extension(value): import os from django.core.exceptions import ValidationError ext = os.path.splitext(value.name)[1] # [0] returns path+filename valid_extensions = ['.jpg','.jpeg','.png'] if not ext.lower() in valid_extensions: raise ValidationError(u'Unsupported file extension.') class Profile(models.Model): """Profile for users(instructors and coordinators)""" user = models.OneToOneField(User) title = models.CharField(max_length=32, blank=True, choices=title) institute = models.CharField(max_length=150, blank=True) department = models.CharField(max_length=150, choices=department_choices) phone_number = models.CharField( max_length=10, validators=[RegexValidator( regex=r'^.{10}$', message=( "Phone number must be entered \ in the format: '9999999999'.\ Up to 10 digits allowed.") )], null=False) position = models.CharField(max_length=32, choices=position_choices, default='contributor') how_did_you_hear_about_us = models.CharField(max_length=255, blank=True, choices=source) location = models.CharField(max_length=255, blank=True, help_text="Place/City") state = models.CharField(max_length=255, choices=states, default="IN-MH") pincode = models.CharField(max_length=6, blank=True, validators=[RegexValidator( regex=r'^.{6}$', message=( "Please enter valid PINCODE" ) )]) is_email_verified = models.BooleanField(default=False) activation_key = models.CharField(max_length=255, blank=True, null=True) key_expiry_time = models.DateTimeField(blank=True, null=True) def __str__(self): return u"id: {0}| {1} {2} | {3} ".format( self.user.id, self.user.first_name, self.user.last_name, self.user.email ) class Category(models.Model): name = models.CharField(max_length=255, unique=True) created = models.DateTimeField(default=timezone.now) description = models.TextField() def __str__(self): return u"{0}".format(self.name) class Animation(models.Model): title = models.CharField(max_length=255) contributor = models.ForeignKey(User, on_delete=models.CASCADE) reviewer = models.ForeignKey(User, null=True, on_delete=models.CASCADE, related_name="%(app_label)s_%(class)s_related") outline = models.TextField() status = models.CharField(max_length=255, choices=status) category = models.ForeignKey(Category, on_delete=models.CASCADE) subcategory = models.CharField(max_length=255, blank=True) created = models.DateTimeField(default=timezone.now) tags = TaggableManager() history = HistoricalRecords() # modifications concepts=models.TextField(null=True,blank=True) audience=models.TextField(null=True,blank=True) reference=models.TextField(null=True,blank=True) tools=models.TextField(null=True,blank=True) detaled_description=models.TextField(null=True,blank=True) link=models.CharField(max_length=255, blank=True) sketch=models.ImageField(null=True, blank=True, upload_to=attachments, validators=[validate_img_extension]) def __str__(self): return u"{0} | {1}".format(self.title, self.status) class Comment(models.Model): comment = models.TextField() commentor = models.ForeignKey(User, on_delete=models.CASCADE) animation = models.ForeignKey(Animation, on_delete=models.CASCADE) created_date = models.DateTimeField(default=timezone.now) animation_status = models.CharField(max_length=255) def __str__(self): return u"{1} | {0}".format( self.created_date, self.commentor ) class AnimationStats(models.Model): animation = models.ForeignKey(Animation, on_delete=models.CASCADE) views = models.PositiveIntegerField(default=0) like = models.PositiveIntegerField(default=0) dislike = models.PositiveIntegerField(default=0) thumbnail = models.ImageField(null=True, blank=True, upload_to=attachments) video_path = models.FileField(null=True, blank=True, upload_to=attachments, validators=[validate_file_extension]) def _create_thumbnail(self): video_path = self.video_path.path img_output = path.join( tempfile.mkdtemp(), "{0}.jpg".format(self.animation.title) ) file_name = "{0}.jpg".format(self.animation.title) subprocess.call(['ffmpeg', '-i', video_path, '-ss', '00:00:02.000', '-vframes', '1', img_output]) if path.exists(img_output): que_file = open(img_output, 'rb') # Converting to Python file object with # some Django-specific additions django_file = File(que_file) self.thumbnail.save(file_name, django_file, save=True) def _create_ogv(self): video_input = self.video_path.path vid_output = path.join( tempfile.mkdtemp(), "{0}.ogv".format(self.animation.title) ) file_name = "{0}.ogv".format(self.animation.title) subprocess.call(['ffmpeg', '-i', video_input, '-r', '24', vid_output]) if path.exists(vid_output): que_file = open(vid_output, 'rb') # Converting to Python file object with # some Django-specific additions django_file = File(que_file) self.video_path.save(file_name, django_file, save=True)