summaryrefslogtreecommitdiff
path: root/showcase/models.py
blob: 1510562f4374a03c7b44d1bacfaa778b00830d56 (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
import json
import requests

from django.conf import settings
from django.core.cache import cache
from django.db import models
from django.utils.translation import ugettext_lazy as _

from wagtail.admin.edit_handlers import FieldPanel

from home.models import BasePage


class ExternalSourceType(models.Model):
    name = models.CharField(max_length=200)
    slug = models.SlugField(max_length=200)
    panels = [
        FieldPanel('name'),
        FieldPanel('slug'),
    ]

    class Meta:
        verbose_name = _("External source type")
        verbose_name_plural = _("External source types")

    def __str__(self):
        return self.name


class ExternalSource(models.Model):
    name = models.CharField(max_length=200)
    error = models.TextField(null=True, blank=True)
    source_type = models.ForeignKey(ExternalSourceType,
                                    on_delete=models.PROTECT)
    api_url = models.URLField()
    api_key = models.CharField(max_length=500, null=True, blank=True)
    panels = [
        FieldPanel('name'),
        FieldPanel('source_type'),
        FieldPanel('api_url'),
        FieldPanel('api_key'),
    ]

    class Meta:
        verbose_name = _("External source")
        verbose_name_plural = _("External sources")

    def __str__(self):
        return self.name

    def get_data(self):
        key = "{}{}-data-{}".format(
            settings.WAGTAIL_SITE_NAME, settings.WAGTAIL_EXTRA_SLUG,
            self.pk
        )
        data = cache.get(key)
        if data:
            return data
        data = []
        headers = {}
        base_error = str(_("Error while fetching the source:")) + " "
        if self.api_key:
            headers = {'Authorization': 'token {}'.format(self.api_key)}
        try:
            response = requests.get(self.api_url, headers=headers)
            if response.status_code == 401:
                self.error = base_error + str(_("permisssion denied - check "
                                                "your API key"))
            else:
                data = json.loads(response.text)
                cache.set(key, data)
                self.error = ""
        except requests.exceptions.Timeout:
            self.error = base_error + str(_("connection time out"))
        except requests.exceptions.TooManyRedirects:
            self.error = base_error + str(_("too many redirection"))
        except requests.exceptions.RequestException as e:
            self.error = base_error + str(_("unknown error")) + " - " + str(e)
        self.save()
        return data

    @property
    def data(self):
        # TODO: cache
        return self.get_data()

    def get_item(self, item_number):
        if item_number >= len(self.data):
            return
        return self.data[item_number]


class ShowCase(BasePage):
    external_source = models.ForeignKey(ExternalSource,
                                        on_delete=models.PROTECT)
    content_panels = [
        FieldPanel('slug'), FieldPanel('external_source')
    ] + BasePage.content_panels

    class Meta:
        verbose_name = _("Show case")
        verbose_name_plural = _("Show cases")

    @property
    def data(self):
        return self.external_source.get_data()