models.py 5.84 KB
from django.db import models

class Subentry(models.Model):
    entry = models.ForeignKey('connections.Entry', related_name='subentries', on_delete=models.PROTECT)
    aspect = models.ForeignKey('Aspect', related_name='subentries', null=True,
                                         on_delete=models.PROTECT)
    inherent_sie = models.ForeignKey('InherentSie', related_name='subentries', null=True,
                                                    on_delete=models.PROTECT)
    negativity = models.ForeignKey('Negativity', related_name='subentries', null=True,
                                                 on_delete=models.PROTECT)
    predicativity = models.ForeignKey('Predicativity', related_name='subentries', null=True,
                                                       on_delete=models.PROTECT)
    schemata = models.ManyToManyField('Schema', related_name='subentries')
    schemata_count = models.PositiveIntegerField(null=False, default=0)

    def __str__(self):
        if self.inherent_sie is None:
            return '%s (%s,%s,%s)' % (self.entry.name, self.negativity, self.predicativity, self.aspect)
        return '%s %s (%s,%s,%s)' % (self.entry.name, self.inherent_sie, self.negativity, self.predicativity,
                                     self.aspect)


class Aspect(models.Model):
    name = models.CharField(max_length=16, unique=True)
    priority = models.PositiveIntegerField()

    class Meta:
        ordering = ['priority']

    def __str__(self):
        return self.name


class InherentSie(models.Model):
    name = models.CharField(max_length=16, unique=True)
    priority = models.PositiveIntegerField()

    class Meta:
        ordering = ['priority']

    def __str__(self):
        return self.name


class Negativity(models.Model):
    name = models.CharField(max_length=16, unique=True)
    priority = models.PositiveIntegerField()

    class Meta:
        ordering = ['priority']

    def __str__(self):
        return self.name


class Predicativity(models.Model):
    name = models.CharField(max_length=16, unique=True)
    priority = models.PositiveIntegerField()

    class Meta:
        ordering = ['priority']

    def __str__(self):
        return self.name


class Schema(models.Model):
    opinion = models.ForeignKey('SchemaOpinion', related_name='schemata', on_delete=models.PROTECT)
    phraseologic = models.BooleanField()
    positions = models.ManyToManyField('Position', related_name='schemata')
    positions_count = models.PositiveIntegerField(null=False, default=0)
    
    def sorted_positions(self):  # TODO: zaimplementowac wlasciwe sortowanie
        return self.positions.all()

    def __str__(self):
        return '%s: %s' % (self.opinion, ' + '.join([str(pos) for pos in self.sorted_positions()]))


class SchemaOpinion(models.Model):
    key = models.CharField(max_length=16, unique=True)
    # name = TODO: wymaga lokalizacji
    priority = models.PositiveIntegerField()

    class Meta:
        ordering = ['priority']

    def __str__(self):
        return self.key


class Position(models.Model):
    function = models.ForeignKey('SyntacticFunction', related_name='positions', null=True,
                                                      on_delete=models.PROTECT)
    control = models.ForeignKey('Control', related_name='positions', null=True,
                                           on_delete=models.PROTECT)
    pred_control = models.ForeignKey('PredicativeControl', related_name='positions', null=True,
                                                           on_delete=models.PROTECT)
    phrase_types = models.ManyToManyField('PhraseType', related_name='positions')
    phrases_count = models.PositiveIntegerField(null=False, default=0)
    
    def sorted_phrase_types(self):  # TODO: zaimplementowac wlasciwe sortowanie
        return self.phrase_types.all()

    def __str__(self):
        categories = []
        if self.function is not None:
            categories.append(str(self.function))
        if self.control is not None:
            categories.append(str(self.control))
        if self.pred_control is not None:
            categories.append(str(self.pred_control))
        return '%s{%s}' % (','.join(categories), ';'.join([str(pt) for pt in self.sorted_phrase_types()]))


class SyntacticFunction(models.Model):
    name = models.CharField(max_length=16, unique=True)
    priority = models.PositiveIntegerField()

    class Meta:
        ordering = ['priority']

    def __str__(self):
        return self.name


class Control(models.Model):
    name = models.CharField(max_length=16, unique=True)
    priority = models.PositiveIntegerField()

    class Meta:
        ordering = ['priority']

    def __str__(self):
        return self.name


class PredicativeControl(models.Model):
    name = models.CharField(max_length=16, unique=True)
    priority = models.PositiveIntegerField()

    class Meta:
        ordering = ['priority']

    def __str__(self):
        return self.name


class NaturalLanguageDescription(models.Model):
    lang = models.CharField(max_length=2, choices=[('pl', 'pl'), ('en', 'en')])
    negativity = models.ForeignKey(Negativity, null=True, on_delete=models.PROTECT)
    function = models.ForeignKey(SyntacticFunction, null=True, on_delete=models.PROTECT)
    control = models.ForeignKey(Control, null=True, on_delete=models.PROTECT)
    pred_control = models.ForeignKey(PredicativeControl, null=True, on_delete=models.PROTECT)
    # phrase_type replaced with phrase_str to reduce number of changes in importer
    #phrase_type = models.ForeignKey(PhraseType, null=False, related_name='descriptions',
    #                                            on_delete=models.PROTECT)
    phrase_str = models.TextField()
    description = models.TextField()

    class Meta:
        unique_together = ['negativity', 'function', 'control', 'pred_control', 'phrase_str', 'description']

    def __str__(self):
        return self.description