diff --git a/docker-compose.yml b/docker-compose.yml index 9831f8c..ce52787 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,6 +1,7 @@ services: db: image: mariadb + container_name: gawa-db networks: - internal ports: @@ -12,13 +13,15 @@ services: MYSQL_ROOT_PASSWORD: root volumes: - ./db/data:/var/lib/mysql - web: + + gawa: build: ./web + container_name: gawa command: python manage.py runserver 0.0.0.0:80 volumes: - ./gawa:/app ports: - - 80:80 + - 8080:80 environment: - MARIADB_NAME=gawa - MARIADB_USER=gawa @@ -27,8 +30,28 @@ services: - internal depends_on: - db + + nginx: + # only for developement. Use dedicated static container in prod + image: nginx + container_name: gawa-web + volumes: + - ./web/templates:/etc/nginx/templates + - ./gawa/static:/var/www/static + - ./gawa/media:/var/www/media + ports: + - 80:80 + environment: + - NGINX_HOST=0.0.0.0 + - NGINX_PORT=80 + networks: + - internal + depends_on: + - gawa + phpmyadmin: image: phpmyadmin + container_name: gawa-db-admin networks: - internal ports: diff --git a/gawa/blog/admin.py b/gawa/blog/admin.py index 7f546c2..889b084 100644 --- a/gawa/blog/admin.py +++ b/gawa/blog/admin.py @@ -10,7 +10,7 @@ class CategoryAdmin(admin.ModelAdmin): list_display = ["name", "slug"] -@admin.action(description=_("Regenerate searchable traits")) +@admin.action(description=_("Regenerate traits")) def regenerate(modeladmin, request, queryset): for obj in queryset: obj.regenerate() diff --git a/gawa/gawa/urls.py b/gawa/gawa/urls.py index 26c88d8..19ffa09 100644 --- a/gawa/gawa/urls.py +++ b/gawa/gawa/urls.py @@ -29,3 +29,9 @@ urlpatterns += i18n_patterns( path("blog/", include("blog.urls")), path('admin/', admin.site.urls, name="admin"), ) + +# use my fancy error pages +# better yet, don't let it come to that +handler400 = 'start.views.Error400' +handler404 = 'start.views.Error404' +handler500 = 'start.views.Error500' diff --git a/gawa/media/img/links/favicons/favicon-23100.png b/gawa/media/img/links/favicons/favicon-23100.png new file mode 100644 index 0000000..83b9a86 Binary files /dev/null and b/gawa/media/img/links/favicons/favicon-23100.png differ diff --git a/gawa/media/img/links/favicons/favicon-23100_T09axyX.png b/gawa/media/img/links/favicons/favicon-23100_T09axyX.png new file mode 100644 index 0000000..83b9a86 Binary files /dev/null and b/gawa/media/img/links/favicons/favicon-23100_T09axyX.png differ diff --git a/gawa/media/img/links/favicons/favicon-26962.png b/gawa/media/img/links/favicons/favicon-26962.png new file mode 100644 index 0000000..6d0105c Binary files /dev/null and b/gawa/media/img/links/favicons/favicon-26962.png differ diff --git a/gawa/media/img/links/favicons/favicon-26962_VpqxCgD.png b/gawa/media/img/links/favicons/favicon-26962_VpqxCgD.png new file mode 100644 index 0000000..6d0105c Binary files /dev/null and b/gawa/media/img/links/favicons/favicon-26962_VpqxCgD.png differ diff --git a/gawa/media/img/links/favicons/favicon-28203.png b/gawa/media/img/links/favicons/favicon-28203.png new file mode 100644 index 0000000..6d0105c Binary files /dev/null and b/gawa/media/img/links/favicons/favicon-28203.png differ diff --git a/gawa/media/img/links/favicons/favicon-28203_RFw83jI.png b/gawa/media/img/links/favicons/favicon-28203_RFw83jI.png new file mode 100644 index 0000000..6d0105c Binary files /dev/null and b/gawa/media/img/links/favicons/favicon-28203_RFw83jI.png differ diff --git a/gawa/media/img/links/favicons/favicon-31235.png b/gawa/media/img/links/favicons/favicon-31235.png new file mode 100644 index 0000000..83b9a86 Binary files /dev/null and b/gawa/media/img/links/favicons/favicon-31235.png differ diff --git a/gawa/media/img/links/favicons/favicon-31235_MCfHdfH.png b/gawa/media/img/links/favicons/favicon-31235_MCfHdfH.png new file mode 100644 index 0000000..83b9a86 Binary files /dev/null and b/gawa/media/img/links/favicons/favicon-31235_MCfHdfH.png differ diff --git a/gawa/media/img/links/favicons/favicon-31594.png b/gawa/media/img/links/favicons/favicon-31594.png new file mode 100644 index 0000000..6d0105c Binary files /dev/null and b/gawa/media/img/links/favicons/favicon-31594.png differ diff --git a/gawa/media/img/links/favicons/favicon-31594_pem4zd8.png b/gawa/media/img/links/favicons/favicon-31594_pem4zd8.png new file mode 100644 index 0000000..6d0105c Binary files /dev/null and b/gawa/media/img/links/favicons/favicon-31594_pem4zd8.png differ diff --git a/gawa/media/img/links/favicons/favicon-35483.png b/gawa/media/img/links/favicons/favicon-35483.png new file mode 100644 index 0000000..8cb4334 Binary files /dev/null and b/gawa/media/img/links/favicons/favicon-35483.png differ diff --git a/gawa/media/img/links/favicons/favicon-35483_ptjrYXm.png b/gawa/media/img/links/favicons/favicon-35483_ptjrYXm.png new file mode 100644 index 0000000..8cb4334 Binary files /dev/null and b/gawa/media/img/links/favicons/favicon-35483_ptjrYXm.png differ diff --git a/gawa/media/img/links/favicons/favicon-35496.png b/gawa/media/img/links/favicons/favicon-35496.png new file mode 100644 index 0000000..6d0105c Binary files /dev/null and b/gawa/media/img/links/favicons/favicon-35496.png differ diff --git a/gawa/media/img/links/favicons/favicon-35496_fp6Ii8D.png b/gawa/media/img/links/favicons/favicon-35496_fp6Ii8D.png new file mode 100644 index 0000000..6d0105c Binary files /dev/null and b/gawa/media/img/links/favicons/favicon-35496_fp6Ii8D.png differ diff --git a/gawa/media/img/links/favicons/favicon-39596.png b/gawa/media/img/links/favicons/favicon-39596.png new file mode 100644 index 0000000..83b9a86 Binary files /dev/null and b/gawa/media/img/links/favicons/favicon-39596.png differ diff --git a/gawa/media/img/links/favicons/favicon-39596_ZXU2LiR.png b/gawa/media/img/links/favicons/favicon-39596_ZXU2LiR.png new file mode 100644 index 0000000..83b9a86 Binary files /dev/null and b/gawa/media/img/links/favicons/favicon-39596_ZXU2LiR.png differ diff --git a/gawa/media/img/links/favicons/favicon-42249.png b/gawa/media/img/links/favicons/favicon-42249.png new file mode 100644 index 0000000..6d0105c Binary files /dev/null and b/gawa/media/img/links/favicons/favicon-42249.png differ diff --git a/gawa/media/img/links/favicons/favicon-42249_HebLTem.png b/gawa/media/img/links/favicons/favicon-42249_HebLTem.png new file mode 100644 index 0000000..6d0105c Binary files /dev/null and b/gawa/media/img/links/favicons/favicon-42249_HebLTem.png differ diff --git a/gawa/media/img/links/favicons/favicon-42369.png b/gawa/media/img/links/favicons/favicon-42369.png new file mode 100644 index 0000000..83b9a86 Binary files /dev/null and b/gawa/media/img/links/favicons/favicon-42369.png differ diff --git a/gawa/media/img/links/favicons/favicon-42369_HRD6l75.png b/gawa/media/img/links/favicons/favicon-42369_HRD6l75.png new file mode 100644 index 0000000..83b9a86 Binary files /dev/null and b/gawa/media/img/links/favicons/favicon-42369_HRD6l75.png differ diff --git a/gawa/media/img/links/favicons/favicon-52973.png b/gawa/media/img/links/favicons/favicon-52973.png new file mode 100644 index 0000000..8cb4334 Binary files /dev/null and b/gawa/media/img/links/favicons/favicon-52973.png differ diff --git a/gawa/media/img/links/favicons/favicon-52973_BYEeReK.png b/gawa/media/img/links/favicons/favicon-52973_BYEeReK.png new file mode 100644 index 0000000..8cb4334 Binary files /dev/null and b/gawa/media/img/links/favicons/favicon-52973_BYEeReK.png differ diff --git a/gawa/media/img/links/favicons/favicon-53284.png b/gawa/media/img/links/favicons/favicon-53284.png new file mode 100644 index 0000000..83b9a86 Binary files /dev/null and b/gawa/media/img/links/favicons/favicon-53284.png differ diff --git a/gawa/media/img/links/favicons/favicon-53284_MLRCSPK.png b/gawa/media/img/links/favicons/favicon-53284_MLRCSPK.png new file mode 100644 index 0000000..83b9a86 Binary files /dev/null and b/gawa/media/img/links/favicons/favicon-53284_MLRCSPK.png differ diff --git a/gawa/media/img/links/favicons/favicon-56750.png b/gawa/media/img/links/favicons/favicon-56750.png new file mode 100644 index 0000000..8cb4334 Binary files /dev/null and b/gawa/media/img/links/favicons/favicon-56750.png differ diff --git a/gawa/media/img/links/favicons/favicon-56750_uiae5s7.png b/gawa/media/img/links/favicons/favicon-56750_uiae5s7.png new file mode 100644 index 0000000..8cb4334 Binary files /dev/null and b/gawa/media/img/links/favicons/favicon-56750_uiae5s7.png differ diff --git a/gawa/media/img/links/favicons/favicon-56954.png b/gawa/media/img/links/favicons/favicon-56954.png new file mode 100644 index 0000000..8cb4334 Binary files /dev/null and b/gawa/media/img/links/favicons/favicon-56954.png differ diff --git a/gawa/media/img/links/favicons/favicon-56954_9dJvozc.png b/gawa/media/img/links/favicons/favicon-56954_9dJvozc.png new file mode 100644 index 0000000..8cb4334 Binary files /dev/null and b/gawa/media/img/links/favicons/favicon-56954_9dJvozc.png differ diff --git a/gawa/media/img/links/favicons/favicon-57343.png b/gawa/media/img/links/favicons/favicon-57343.png new file mode 100644 index 0000000..83b9a86 Binary files /dev/null and b/gawa/media/img/links/favicons/favicon-57343.png differ diff --git a/gawa/media/img/links/favicons/favicon-57343_tpkQh5a.png b/gawa/media/img/links/favicons/favicon-57343_tpkQh5a.png new file mode 100644 index 0000000..83b9a86 Binary files /dev/null and b/gawa/media/img/links/favicons/favicon-57343_tpkQh5a.png differ diff --git a/gawa/media/img/links/favicons/favicon-59068.png b/gawa/media/img/links/favicons/favicon-59068.png new file mode 100644 index 0000000..8cb4334 Binary files /dev/null and b/gawa/media/img/links/favicons/favicon-59068.png differ diff --git a/gawa/media/img/links/favicons/favicon-59068_7JoCTKP.png b/gawa/media/img/links/favicons/favicon-59068_7JoCTKP.png new file mode 100644 index 0000000..8cb4334 Binary files /dev/null and b/gawa/media/img/links/favicons/favicon-59068_7JoCTKP.png differ diff --git a/gawa/media/img/links/favicons/favicon-59184.png b/gawa/media/img/links/favicons/favicon-59184.png new file mode 100644 index 0000000..8cb4334 Binary files /dev/null and b/gawa/media/img/links/favicons/favicon-59184.png differ diff --git a/gawa/media/img/links/favicons/favicon-59184_1ypR2m9.png b/gawa/media/img/links/favicons/favicon-59184_1ypR2m9.png new file mode 100644 index 0000000..8cb4334 Binary files /dev/null and b/gawa/media/img/links/favicons/favicon-59184_1ypR2m9.png differ diff --git a/gawa/media/img/links/favicons/favicon-59959.png b/gawa/media/img/links/favicons/favicon-59959.png new file mode 100644 index 0000000..6d0105c Binary files /dev/null and b/gawa/media/img/links/favicons/favicon-59959.png differ diff --git a/gawa/media/img/links/favicons/favicon-59959_dwMkkk7.png b/gawa/media/img/links/favicons/favicon-59959_dwMkkk7.png new file mode 100644 index 0000000..6d0105c Binary files /dev/null and b/gawa/media/img/links/favicons/favicon-59959_dwMkkk7.png differ diff --git a/gawa/start/admin.py b/gawa/start/admin.py index 446cfb6..0417c90 100644 --- a/gawa/start/admin.py +++ b/gawa/start/admin.py @@ -5,7 +5,7 @@ from django.utils.translation import gettext as _ from .models import * -@admin.action(description=_("Regenerate searchable traits")) +@admin.action(description=_("Regenerate traits")) def regenerate(modeladmin, request, queryset): for obj in queryset: obj.regenerate() @@ -41,6 +41,6 @@ class LinkAdmin(admin.ModelAdmin): """ Admin Interface for Links """ - list_display = ["title_en", "title_de", "url", "suburl", "favicon"] - ordering = ['title_de', 'title_en'] + list_display = ["title_en", "title_de", "url", "suburl", "favicon", "status"] + ordering = ['status', 'title_de', 'title_en'] actions = [regenerate] diff --git a/gawa/start/migrations/0008_link_status.py b/gawa/start/migrations/0008_link_status.py new file mode 100644 index 0000000..8509f2a --- /dev/null +++ b/gawa/start/migrations/0008_link_status.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.19 on 2023-06-05 20:55 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('start', '0007_link_favicon'), + ] + + operations = [ + migrations.AddField( + model_name='link', + name='status', + field=models.BooleanField(default=False), + ), + ] diff --git a/gawa/start/models.py b/gawa/start/models.py index 4300a0d..80c1ce4 100644 --- a/gawa/start/models.py +++ b/gawa/start/models.py @@ -96,7 +96,9 @@ class Link(Searchable): # the actual link url = models.URLField(unique=True, null=False, primary_key=True) - favicon = models.ImageField(blank=True, upload_to="img/links/favicons") + favicon_dir: str = "img/links/favicons" + favicon = models.ImageField(blank=True, upload_to=favicon_dir) + status = models.BooleanField(default=False) def __str__(self): return f"{{<{self.__class__.__name__}>\"{self.title_en}\"}}" @@ -112,23 +114,29 @@ class Link(Searchable): logger.info(f"regenerating {self.__class__.__name__} object: {self}") self.suburl = f"/links#{self.title_en}" logger.info(f"getting favicon for link object {self}: '{self.url}'") - icons = favicon.get(self.url, timeout=2) - if icons[0] is None: + try: + icons = favicon.get(self.url, timeout=2) + except (ConnectionError) as ce: # just keep whatever was stored if we cant get a new favicon - return + logger.warn(f"unable to download favicon for {self}: {ce.with_traceback(None)}") + self.status = False - response = requests.get(icons[0].url, stream=True) - filename: str = f"favicon-{random.randint(0x1000, 0xffff)}.{icons[0].format}" - logger.debug(response) - logger.debug(filename) - with open(f"{settings.MEDIA_ROOT}/{filename}", 'wb') as image: - for chunk in response.iter_content(1024): - image.write(chunk) - logger.debug(image) - with open(f"{settings.MEDIA_ROOT}/{filename}", 'rb') as image: - self.favicon.save(filename, File(image)) + except Exception as e: + logger.warn(f"Unexpected Exception while downloading {self}: {e.with_traceback(None)}") + self.status = False + + else: + response = requests.get(icons[0].url, stream=True) + filename: str = f"favicon-{random.randint(0x1000, 0xffff)}.{icons[0].format}" + with open(f"{settings.MEDIA_ROOT}/{self.favicon_dir}/{filename}", 'wb') as image: + for chunk in response.iter_content(1024): + image.write(chunk) + logger.debug(image) + with open(f"{settings.MEDIA_ROOT}/{self.favicon_dir}/{filename}", 'rb') as image: + self.favicon.save(filename, File(image)) + logger.info(f"downloaded favicon for {self}") + self.status = True - #self.favicon.save(f"favicon-{self.title_en}", favicon.get(self.url, timeout=2)) self.save() class Meta: diff --git a/gawa/start/templates/errors/400.html b/gawa/start/templates/errors/400.html new file mode 100644 index 0000000..8e58b3a --- /dev/null +++ b/gawa/start/templates/errors/400.html @@ -0,0 +1,15 @@ +{% extends 'base.html' %} +{% load i18n %} +{% get_current_language as LANGUAGE_CODE %} +{% block languagecode %}{{ LANGUAGE_CODE }}{% endblock languagecode %} +{% block title %}{% translate "cscherr.de" %} - {% translate "startpage" %}{% endblock title %} +{% block main %} +
+

404 {% translate "Bad request" %}

+

{% translate "You sent bad data to the server." %}

+
+
+

{% translate "Looking for anything specific?" %}

+ {% include 'main_search_form.html' %} +
+{% endblock main %} diff --git a/gawa/start/templates/errors/404.html b/gawa/start/templates/errors/404.html new file mode 100644 index 0000000..3153bef --- /dev/null +++ b/gawa/start/templates/errors/404.html @@ -0,0 +1,15 @@ +{% extends 'base.html' %} +{% load i18n %} +{% get_current_language as LANGUAGE_CODE %} +{% block languagecode %}{{ LANGUAGE_CODE }}{% endblock languagecode %} +{% block title %}{% translate "cscherr.de" %} - {% translate "startpage" %}{% endblock title %} +{% block main %} +
+

404 {% translate "Not found" %}

+

{% translate "The resource you are looking for does not exist." %}

+
+
+

{% translate "Looking for anything specific?" %}

+ {% include 'main_search_form.html' %} +
+{% endblock main %} diff --git a/gawa/start/templates/errors/bad_request.html b/gawa/start/templates/errors/500.html similarity index 82% rename from gawa/start/templates/errors/bad_request.html rename to gawa/start/templates/errors/500.html index 514687d..cfc873d 100644 --- a/gawa/start/templates/errors/bad_request.html +++ b/gawa/start/templates/errors/500.html @@ -5,8 +5,8 @@ {% block title %}{% translate "cscherr.de" %} - {% translate "startpage" %}{% endblock title %} {% block main %}
-

{% translate "Bad request" %}

-

{% translate "You fucked up" %}

+

500 {% translate "Internal Server Error" %}

+

{% translate "Something went wrong." %}

{% translate "Looking for anything specific?" %}

diff --git a/gawa/start/templates/start/links.html b/gawa/start/templates/start/links.html index f94c959..0137411 100644 --- a/gawa/start/templates/start/links.html +++ b/gawa/start/templates/start/links.html @@ -26,7 +26,7 @@

{{ link.desc_en }}

{% endif %}
-
+