summaryrefslogtreecommitdiffstats
path: root/equations/models.py
blob: 7a5f8fe5684acda683add5e176514e6815a7a89e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
from django.db import models
from django.utils.translation import gettext_lazy as _
import django.contrib.auth.models as auth
from django.conf import settings
from django.dispatch import dispatcher
from django.db.models import signals
from signals import update_render

class Symbol(models.Model):
    name = models.CharField(_("Name"), max_length=256)
    latex = models.TextField(_("Raw LaTeX"), unique=True)
    unicode = models.TextField(_("Unicode Representation"), blank=True)
    renderdir = "symbolrenders/"
    render = models.ImageField(_("Rendered Image"), 
        upload_to=renderdir, editable=False)

    class Meta:
        get_latest_by = 'name'
    class Admin:
        ordering = ['name']

    def __str__(self):
        return self.name
    def get_absolute_url(self):
        return "/symbol/%s/" % self.id
    def get_admin_url(self):
        return "/admin/symbols/%s/" % self.id
    #def save(self):
    #    super(Symbol, self)
    #    self.update_generic_variable()
    def save(self):
        super(Symbol, self).save()
        self.render = self.renderdir + "%s.png" % self.id
        super(Symbol, self).save()

def update_generic_variable(sender, instance, signal, *args, **kwargs):
    """Checks if there is a generic variable associated with this
        symbol; create one if there isn't"""
    for v in Variable.objects.filter(isgeneric=True):
        if v.latex == instance.latex:
            return
    genericv = Variable(name="Generic %s" % instance.name,
                        latex=instance.latex,
                        unicode=instance.unicode,
                        symbol=instance,
                        isgeneric=True)
    genericv.save()

signals.pre_save.connect(update_render, sender=Symbol)
signals.post_save.connect(update_generic_variable, sender=Symbol)
#dispatcher.connect(update_render, signal=signals.pre_save, sender=Symbol)
#dispatcher.connect(update_generic_variable, signal=signals.post_save, 
#    sender=Symbol)

class Variable(models.Model):
    name = models.CharField(_("Name"), max_length=256)
    latex = models.TextField(_("Raw LaTeX"), unique=True)
    unicode = models.TextField(_("Unicode Representation"), blank=True)
    description = models.TextField(_("Description"), blank=True)
    renderdir = "variablerenders/"
    render = models.ImageField(_("Rendered Image"), 
        upload_to=renderdir, editable=False)
    reference = models.URLField(_("Reference URL"), blank=True)
    symbol = models.ForeignKey(Symbol, verbose_name=_("Symbol"))
    isgeneric = models.BooleanField(_("Is Generic?"), default=False)

    class Meta:
        get_latest_by = 'name'
    class Admin:
        ordering = ['name']

    def __str__(self):
        return self.name
    def get_absolute_url(self):
        return "/variable/%s/" % self.id
    def get_admin_url(self):
        return "/admin/variables/%s/" % self.id
    def save(self):
        super(Variable, self).save()
        self.render = self.renderdir + "%s.png" % self.id
        super(Variable, self).save()

signals.pre_save.connect(update_render, sender=Variable)
#dispatcher.connect(update_render, signal=signals.pre_save, sender=Variable)

class Equation(models.Model):
    name = models.CharField(_("Name"), max_length=256)
    latex = models.TextField(_("Raw LaTeX"), unique=True)
    unicode = models.TextField(_("Unicode Representation"), blank=True)
    description = models.TextField(_("Description"), blank=True)
    created = models.DateField(_("Created"), auto_now_add=True)
    updated = models.DateField(_("Last Updated"), auto_now_add=True)
    owner = models.ForeignKey(auth.User, verbose_name=_("Owner"))
    variables = models.ManyToManyField(Variable, verbose_name="Variables",
        editable=True)
    renderdir = "equationrenders/"
    render = models.ImageField(_("Rendered Image"), 
        upload_to=renderdir, editable=False)
    reference = models.URLField(_("Reference URL"), blank=True)

    class Meta:
        get_latest_by = 'created'
    class Admin:
        ordering = ['created']

    def __str__(self):
        return self.name
    def get_absolute_url(self):
        return "/equation/%s/" % self.id
    def get_admin_url(self):
        return "/admin/equations/%s/" % self.id
    def update_variables(self):
        """Updates the variables field with all Variable objects found
           in the LaTeX representation."""
        pass # TODO: write
    def save(self):
        self.update_variables()
        super(Equation, self).save()
        self.render = self.renderdir + "%s.png" % self.id
        super(Equation, self).save()

signals.post_save.connect(update_render, sender=Equation)
#dispatcher.connect(update_render, signal=signals.post_save, sender=Equation)