class UnspecifiedPublication(models.Model): """ Reprezentuje výsledky, brožúrku alebo akýkoľvek materiál zverejnený k nejakému Eventu okrem časopisov. Časopisy majú vlastnú triedu SemesterPublication. """ class Meta: verbose_name = 'iná publikácia' verbose_name_plural = 'iné publikácie' name = models.CharField(max_length=30, blank=True) event = models.ForeignKey(Event, null=True, on_delete=models.SET_NULL) file = RestrictedFileField( upload_to='publications/%Y', content_types=['application/pdf', 'application/zip'], verbose_name='súbor') def generate_name(self, forced=False): if self.name and not forced: return self.name = f'{self.event.competition}-{self.event.year}' self.save() def __str__(self): return self.name def can_user_modify(self, user): return self.event.can_user_modify(user)
class Publication(models.Model): """ Reprezentuje časopis, výsledky, brožúrku alebo akýkoľvek materiál zverejnený k nejakému Eventu """ class Meta: verbose_name = 'publikácia' verbose_name_plural = 'publikácie' constraints = [ UniqueConstraint(fields=['event', 'order'], name='unique_order_in_event') ] name = models.CharField(max_length=30, blank=True) event = models.ForeignKey(Event, null=True, on_delete=models.SET_NULL) order = models.PositiveSmallIntegerField() file = RestrictedFileField( upload_to='publications/%Y', content_types=['application/pdf', 'application/zip'], verbose_name='súbor') thumbnail = models.ImageField(upload_to='publications/thumbnails/%Y', blank=True, verbose_name='náhľad') def generate_name(self, forced=False): if self.name and not forced: return self.name = f'{self.event.competition}-{self.event.year}-{self.order}' self.save() def generate_thumbnail(self, forced=False): if mime_type(self.file) != 'application/pdf': return if self.thumbnail and not forced: return with self.file.open(mode='rb') as file: pil_image = pdf2image.convert_from_bytes(file.read(), first_page=1, last_page=1)[0] png_image_bytes = BytesIO() pil_image.save(png_image_bytes, format='png') png_image_bytes.seek(0) thumbnail_filename = os.path.splitext(os.path.basename( self.file.name))[0] + '.png' if self.thumbnail: self.thumbnail.delete() self.thumbnail.save(thumbnail_filename, ContentFile(png_image_bytes.read())) def __str__(self): return self.name
class SemesterPublication(Publication): class Meta: verbose_name = 'časopis' verbose_name_plural = 'časopisy' order = models.PositiveSmallIntegerField() file = RestrictedFileField( upload_to='publications/semester_publication/%Y', content_types=['application/pdf'], verbose_name='súbor') thumbnail = models.ImageField(upload_to='publications/thumbnails/%Y', blank=True, verbose_name='náhľad') def validate_unique(self, *args, **kwargs): super(SemesterPublication, self).validate_unique(*args, **kwargs) e = self.event if Publication.objects.filter(event=e, semesterpublication__isnull=False) \ .filter(~Q(semesterpublication=self.pk), semesterpublication__order=self.order) \ .exists(): raise ValidationError({ 'order': 'Časopis s týmto číslom už v danom semestri existuje', }) def generate_thumbnail(self, forced=False): if mime_type(self.file) != 'application/pdf': return if self.thumbnail and not forced: return with self.file.open(mode='rb') as file: pil_image = pdf2image.convert_from_bytes(file.read(), first_page=1, last_page=1)[0] png_image_bytes = BytesIO() pil_image.save(png_image_bytes, format='png') png_image_bytes.seek(0) thumbnail_filename = os.path.splitext(os.path.basename( self.file.name))[0] + '.png' if self.thumbnail: self.thumbnail.delete() self.thumbnail.save(thumbnail_filename, ContentFile(png_image_bytes.read())) def __str__(self): return self.name def generate_name(self, forced=False): if self.name and not forced: return self.name = f'{self.event.competition}-{self.event.year}-{self.order}' self.save()
class UnspecifiedPublication(Publication): class Meta: verbose_name = 'iná publikácia' verbose_name_plural = 'iné publikácie' file = RestrictedFileField( upload_to='publications/%Y', content_types=['application/pdf', 'application/zip'], verbose_name='súbor') def generate_name(self, forced=False): if self.name and not forced: return self.name = f'{self.event.competition}-{self.event.year}' self.save() def __str__(self): return self.name
class SemesterPublication(models.Model): """ Časopis """ class Meta: verbose_name = 'časopis' verbose_name_plural = 'časopisy' name = models.CharField(max_length=30, blank=True) semester = models.ForeignKey( Semester, null=True, on_delete=models.SET_NULL) order = models.PositiveSmallIntegerField() file = RestrictedFileField( upload_to='publications/semester_publication/%Y', content_types=['application/pdf'], verbose_name='súbor') thumbnail = models.ImageField( upload_to='publications/thumbnails/%Y', blank=True, verbose_name='náhľad') def validate_unique(self, exclude=None): if SemesterPublication.objects.filter(semester=self.semester) \ .filter(~Q(pk=self.pk), order=self.order) \ .exists(): raise ValidationError({ 'order': 'Časopis s týmto číslom už v danom semestri existuje', }) def generate_thumbnail(self, forced=False): if mime_type(self.file) != 'application/pdf': return if self.thumbnail and not forced: return with self.file.open(mode='rb') as file: pil_image = pdf2image.convert_from_bytes( file.read(), first_page=1, last_page=1)[0] png_image_bytes = BytesIO() pil_image.save(png_image_bytes, format='png') png_image_bytes.seek(0) thumbnail_filename = os.path.splitext( os.path.basename(self.file.name))[0] + '.png' if self.thumbnail: self.thumbnail.delete() self.thumbnail.save( thumbnail_filename, ContentFile(png_image_bytes.read())) def __str__(self): return self.name def generate_name(self, forced=False): if self.name and not forced: return self.name = f'{self.semester.competition}-{self.semester.year}-{self.order}' self.save() def can_user_modify(self, user): return self.semester.can_user_modify(user)