summaryrefslogtreecommitdiff
path: root/showcase/models.py
diff options
context:
space:
mode:
Diffstat (limited to 'showcase/models.py')
-rw-r--r--showcase/models.py103
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()
+