Esempio n. 1
0
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)
Esempio n. 2
0
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
Esempio n. 3
0
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()
Esempio n. 4
0
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
Esempio n. 5
0
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)