summaryrefslogtreecommitdiff
path: root/commcrawler/models.py
blob: f62157e0f72263d7e04165856f08bed65a2bb896 (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
import datetime

from django.db import models
from django.utils.translation import ugettext_lazy as _


class AreaType(models.Model):
    name = models.CharField(_("Name"), max_length=200)

    class Meta:
        verbose_name = _("Area type")
        verbose_name_plural = _("Area types")
        ordering = ("name", )

    def __str__(self):
        return self.name


class Area(models.Model):
    name = models.CharField(verbose_name=_("Name"), max_length=200)
    area_type = models.ForeignKey(
        AreaType, on_delete=models.CASCADE, verbose_name=_("Type"))
    population = models.IntegerField(verbose_name=_("Population"), blank=True,
                                     null=True)
    reference = models.CharField(
        verbose_name=_("Reference"), max_length=100, blank=True, null=True,
        help_text=_("For instance, INSEE code for towns")
    )
    parent = models.ForeignKey("Area", verbose_name=_("Parent"),
                               blank=True, null=True)

    class Meta:
        verbose_name = _("Area")
        verbose_name_plural = _("Areas")
        ordering = ("name", )

    def __str__(self):
        if not self.parent:
            return self.name
        return "{} / {}".format(self.parent, self.name)


class OrganizationType(models.Model):
    name = models.CharField(_("Name"), max_length=200)
    parent = models.ForeignKey("OrganizationType", verbose_name=_("Parent"),
                               blank=True, null=True)

    class Meta:
        verbose_name = _("Organization type")
        verbose_name_plural = _("Organization types")
        ordering = ("parent__name", "name", )

    def __str__(self):
        if not self.parent:
            return self.name
        return "{} / {}".format(self.parent, self.name)


class Organization(models.Model):
    name = models.CharField(verbose_name=_("Name"), max_length=200)
    area = models.ForeignKey(
        Area, on_delete=models.SET_NULL, verbose_name=_("Area"), blank=True,
        null=True
    )
    organization_type = models.ForeignKey(
        OrganizationType, on_delete=models.CASCADE, verbose_name=_("Type"))
    address = models.TextField(verbose_name=_("Address"), blank=True, null=True)

    class Meta:
        verbose_name = _("Organization")
        verbose_name_plural = _("Organizations")
        ordering = ("name", )

    def __str__(self):
        if not self.area:
            return "{} ({})".format(
                self.name, self.organization_type)
        return "{} - {} ({})".format(
            self.name, self.area, self.organization_type)


class Target(models.Model):
    name = models.CharField(verbose_name=_("Name"), max_length=200)
    url = models.URLField(verbose_name=_("URL"), blank=True, null=True)
    organization = models.ForeignKey(
        Organization, verbose_name=_("Organization"), blank=True,
        null=True, on_delete=models.SET_NULL)

    class Meta:
        verbose_name = _("Target")
        verbose_name_plural = _("Targets")
        ordering = ("name",)

    def __str__(self):
        return "{} ({})".format(self.name, self.organization)


class Crawl(models.Model):
    STATUS = (
        ('C', _("Created")), ('P', _("In progress")),
        ('F', _("Finished"))
    )
    name = models.CharField(verbose_name=_("Name"), max_length=200)
    created = models.DateTimeField(
        verbose_name=_("Creation date"), default=datetime.datetime.now)
    started = models.DateTimeField(
        verbose_name=_("Start date"), blank=True, null=True)
    ended = models.DateTimeField(
        verbose_name=_("End date"), blank=True, null=True)
    status = models.CharField(max_length=1, choices=STATUS, default='C')
    targets = models.ManyToManyField("Target", blank=True)

    class Meta:
        verbose_name = _("Crawl")
        verbose_name_plural = _("Crawls")
        ordering = ("created", "name")

    def __str__(self):
        return self.name

    @property
    def target_nb(self):
        return self.targets.count()