diff --git a/gulaschromstore/settings.py b/gulaschromstore/settings.py index 7eb50a7..4ce0455 100644 --- a/gulaschromstore/settings.py +++ b/gulaschromstore/settings.py @@ -39,6 +39,7 @@ INSTALLED_APPS = [ 'django.contrib.staticfiles', 'taggit', 'taggit_helpers', + 'stdimage', 'users', 'roms' ] @@ -135,3 +136,5 @@ EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend' AUTH_USER_MODEL = 'users.User' LOGIN_REDIRECT_URL = '/' + +TAGGIT_CASE_INSENSITIVE = True diff --git a/gulaschromstore/urls.py b/gulaschromstore/urls.py index 5645899..26b8d4a 100644 --- a/gulaschromstore/urls.py +++ b/gulaschromstore/urls.py @@ -4,7 +4,11 @@ from django.contrib import admin from gulaschromstore.settings import MEDIA_URL, MEDIA_ROOT +from roms.views import RomList + + urlpatterns = [ + url(r'^$', RomList.as_view()), url(r'^roms/', include('roms.urls')), url(r'^users/', include('users.urls')), url(r'^admin/', admin.site.urls), diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..c627f0e --- /dev/null +++ b/requirements.txt @@ -0,0 +1,12 @@ +appdirs==1.4.0 +Django==1.10.5 +django-stdimage==2.4.1 +django-taggit==0.22.0 +django-taggit-helpers==0.1.4 +olefile==0.44 +packaging==16.8 +Pillow==4.0.0 +progressbar2==3.20.0 +pyparsing==2.1.10 +python-utils==2.1.0 +six==1.10.0 diff --git a/roms/migrations/0002_auto_20170506_2044.py b/roms/migrations/0002_auto_20170506_2044.py new file mode 100644 index 0000000..4bd281e --- /dev/null +++ b/roms/migrations/0002_auto_20170506_2044.py @@ -0,0 +1,32 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.5 on 2017-05-06 20:44 +from __future__ import unicode_literals + +from django.db import migrations, models +import roms.models + + +class Migration(migrations.Migration): + + dependencies = [ + ('roms', '0001_initial'), + ] + + operations = [ + migrations.RemoveField( + model_name='rom', + name='binary', + ), + migrations.AddField( + model_name='rom', + name='high_binary', + field=models.FileField(default='', upload_to=roms.models.upload_binary_to, verbose_name='high binary'), + preserve_default=False, + ), + migrations.AddField( + model_name='rom', + name='low_binary', + field=models.FileField(default='', upload_to=roms.models.upload_binary_to, verbose_name='low binary'), + preserve_default=False, + ), + ] diff --git a/roms/migrations/0003_auto_20170506_2213.py b/roms/migrations/0003_auto_20170506_2213.py new file mode 100644 index 0000000..f5a7b9c --- /dev/null +++ b/roms/migrations/0003_auto_20170506_2213.py @@ -0,0 +1,28 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.5 on 2017-05-06 22:13 +from __future__ import unicode_literals + +from django.db import migrations +import roms.models +import stdimage.models +import taggit.managers + + +class Migration(migrations.Migration): + + dependencies = [ + ('roms', '0002_auto_20170506_2044'), + ] + + operations = [ + migrations.AlterField( + model_name='rom', + name='cover', + field=stdimage.models.StdImageField(upload_to=roms.models.upload_cover_to, verbose_name='cover image'), + ), + migrations.AlterField( + model_name='rom', + name='tags', + field=taggit.managers.TaggableManager(blank=True, help_text='A comma-separated list of tags.', through='taggit.TaggedItem', to='taggit.Tag', verbose_name='Tags'), + ), + ] diff --git a/roms/models.py b/roms/models.py index 047bb47..bb107a9 100644 --- a/roms/models.py +++ b/roms/models.py @@ -6,9 +6,12 @@ from django.core.exceptions import ValidationError from taggit.managers import TaggableManager +from stdimage.models import StdImageField +from stdimage.validators import MinSizeValidator + def upload_cover_to(instance, filename): _, ext = os.path.splitext(filename) - return "covers/%s.%s" % (uuid.uuid4(), ext) + return "covers/%s%s" % (uuid.uuid4(), ext) def upload_binary_to(instance, filename): return "roms/%s.bin" % uuid.uuid4() @@ -17,10 +20,15 @@ def upload_binary_to(instance, filename): class Rom(models.Model): name = models.CharField("name", max_length = 128) description = models.TextField("description") - cover = models.ImageField("cover image", upload_to=upload_cover_to) - binary = models.FileField("binary", upload_to=upload_binary_to) + cover = StdImageField("cover image", + upload_to = upload_cover_to, + validators = [MinSizeValidator(300,300)], + variations = {'large': {'width': 600, 'height': 600, 'crop': True}, + 'small': {'width': 300, 'height': 300, 'crop': True}}) + low_binary = models.FileField("low binary", upload_to=upload_binary_to) + high_binary = models.FileField("high binary", upload_to=upload_binary_to) approved = models.BooleanField("approved") - tags = TaggableManager() + tags = TaggableManager(blank = True) def tag_list(self): return [t.name for t in self.tags.all()] @@ -31,11 +39,11 @@ class Rom(models.Model): 'name' : self.name, 'description' : self.description, 'tags' : self.tag_list(), - 'cover' : self.cover, - 'binary' : self.binary + 'low_binary' : self.low_binary.url, + 'high_binary' : self.high_binary.url } return json def __str__(self): - return "Rom %s" % self.name + return self.name diff --git a/roms/templates/roms/list.html b/roms/templates/roms/list.html new file mode 100644 index 0000000..f832ffe --- /dev/null +++ b/roms/templates/roms/list.html @@ -0,0 +1,40 @@ +{% extends "base.html" %} + +{% load static %} + + +{% block title %}Roms{% endblock %} +{% block nav_rom_class %}is-active{% endblock %} + + +{% block content %} +
+
+
+
+ Kategorie: + Alle + {% for tag in tags %} + {{tag.name}} + {% endfor %} +
+
+
+ +
+ {% for rom in roms %} + + {% if forloop.counter|divisibleby:4 %} +
+
+ {% endif %} + + {% endfor %} +
+
+{% endblock %} diff --git a/roms/urls.py b/roms/urls.py index b5e63f7..9703cd8 100644 --- a/roms/urls.py +++ b/roms/urls.py @@ -1,8 +1,12 @@ from django.conf.urls import include, url -from roms.views import RomListJson, RomDetailViewJson +from roms.views import RomListJson, RomDetailViewJson, RomList urlpatterns = [ - url(r'json/$', RomListJson.as_view()), - url(r'json/(?P[0-9]+)/$', RomDetailViewJson.as_view()) + url(r'^json/list/$', RomListJson.as_view()), + url(r'^json/list/(?P[a-zA-Z0-9-]+)/$', RomListJson.as_view()), + url(r'^json/details/(?P[0-9]+)/$', RomDetailViewJson.as_view()), + + url(r'^list/$', RomList.as_view(), name='romlist'), + url(r'^list/(?P[a-zA-Z0-9-]+)/$', RomList.as_view(), name='romlist') ] diff --git a/roms/views.py b/roms/views.py index 6403e5a..47497fa 100644 --- a/roms/views.py +++ b/roms/views.py @@ -2,24 +2,66 @@ from django.views.generic.list import ListView from django.views.generic.detail import DetailView from django.http import JsonResponse +from taggit.models import Tag + from roms.models import Rom -class RomListJson(ListView): +class RomList(ListView): + template_name = 'roms/list.html' + context_object_name = 'roms' + + def get_queryset(self): - return Rom.objects.all().filter(approved = True) + tag = self.kwargs.get('tag', None) + + queryset = Rom.objects.all().filter(approved = True) + if tag != None: + queryset = queryset.filter(tags__slug = tag) + + return queryset + + + def get_context_data(self, **kwargs): + context = super(RomList, self).get_context_data(**kwargs) + + context['filter_tag'] = self.kwargs.get('tag', None) + context['tags'] = Tag.objects.all() + + return context + + +class RomListJson(ListView): + + def get_queryset(self): + tag = self.kwargs.get('tag', None) + + queryset = Rom.objects.all().filter(approved = True) + if tag != None: + queryset = queryset.filter(tags__slug = tag) + + return queryset + def render_to_response(self, context, **response_kwargs): queryset = self.get_queryset() - json = {} + filter_tag = self.kwargs.get('tag', '') + + json = { + 'filter_tag' : filter_tag, + 'tags': {}, + 'roms' : {}, + } + for tag in Tag.objects.all(): + json['tags'][tag.slug] = tag.name + for rom in queryset: - json[rom.id] = rom.name + json['roms'][rom.id] = rom.name return JsonResponse(json, **response_kwargs, safe=False) - class RomDetailViewJson(DetailView): model = Rom pk_url_kwarg = 'id' diff --git a/templates/base.html b/templates/base.html index 9f443da..936f872 100644 --- a/templates/base.html +++ b/templates/base.html @@ -19,7 +19,7 @@ + href="{% url 'romlist' %}"> Roms {% if user.is_authenticated %} @@ -37,7 +37,7 @@