diff options
Diffstat (limited to 'showcase/models.py')
-rw-r--r-- | showcase/models.py | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/showcase/models.py b/showcase/models.py new file mode 100644 index 0000000..ab04f93 --- /dev/null +++ b/showcase/models.py @@ -0,0 +1,103 @@ +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) + 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() + |