Added list view for roms

This commit is contained in:
Sebastian 2017-05-07 01:31:35 +02:00
parent 4b69cd0251
commit ff5318b7aa
11 changed files with 215 additions and 17 deletions

View File

@ -39,6 +39,7 @@ INSTALLED_APPS = [
'django.contrib.staticfiles', 'django.contrib.staticfiles',
'taggit', 'taggit',
'taggit_helpers', 'taggit_helpers',
'stdimage',
'users', 'users',
'roms' 'roms'
] ]
@ -135,3 +136,5 @@ EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
AUTH_USER_MODEL = 'users.User' AUTH_USER_MODEL = 'users.User'
LOGIN_REDIRECT_URL = '/' LOGIN_REDIRECT_URL = '/'
TAGGIT_CASE_INSENSITIVE = True

View File

@ -4,7 +4,11 @@ from django.contrib import admin
from gulaschromstore.settings import MEDIA_URL, MEDIA_ROOT from gulaschromstore.settings import MEDIA_URL, MEDIA_ROOT
from roms.views import RomList
urlpatterns = [ urlpatterns = [
url(r'^$', RomList.as_view()),
url(r'^roms/', include('roms.urls')), url(r'^roms/', include('roms.urls')),
url(r'^users/', include('users.urls')), url(r'^users/', include('users.urls')),
url(r'^admin/', admin.site.urls), url(r'^admin/', admin.site.urls),

12
requirements.txt Normal file
View File

@ -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

View File

@ -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,
),
]

View File

@ -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'),
),
]

View File

@ -6,9 +6,12 @@ from django.core.exceptions import ValidationError
from taggit.managers import TaggableManager from taggit.managers import TaggableManager
from stdimage.models import StdImageField
from stdimage.validators import MinSizeValidator
def upload_cover_to(instance, filename): def upload_cover_to(instance, filename):
_, ext = os.path.splitext(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): def upload_binary_to(instance, filename):
return "roms/%s.bin" % uuid.uuid4() return "roms/%s.bin" % uuid.uuid4()
@ -17,10 +20,15 @@ def upload_binary_to(instance, filename):
class Rom(models.Model): class Rom(models.Model):
name = models.CharField("name", max_length = 128) name = models.CharField("name", max_length = 128)
description = models.TextField("description") description = models.TextField("description")
cover = models.ImageField("cover image", upload_to=upload_cover_to) cover = StdImageField("cover image",
binary = models.FileField("binary", upload_to=upload_binary_to) 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") approved = models.BooleanField("approved")
tags = TaggableManager() tags = TaggableManager(blank = True)
def tag_list(self): def tag_list(self):
return [t.name for t in self.tags.all()] return [t.name for t in self.tags.all()]
@ -31,11 +39,11 @@ class Rom(models.Model):
'name' : self.name, 'name' : self.name,
'description' : self.description, 'description' : self.description,
'tags' : self.tag_list(), 'tags' : self.tag_list(),
'cover' : self.cover, 'low_binary' : self.low_binary.url,
'binary' : self.binary 'high_binary' : self.high_binary.url
} }
return json return json
def __str__(self): def __str__(self):
return "Rom %s" % self.name return self.name

View File

@ -0,0 +1,40 @@
{% extends "base.html" %}
{% load static %}
{% block title %}Roms{% endblock %}
{% block nav_rom_class %}is-active{% endblock %}
{% block content %}
<div class="rom-overview">
<div class="columns">
<div class="column">
<div class="box">
<strong>Kategorie:</strong>
<a href="{% url 'romlist' %}"><span class="tag is-medium categorie {% if filter_tag == None %}is-primary{% endif %}">Alle</span></a>
{% for tag in tags %}
<a href="{% url 'romlist' tag=tag.slug %}"><span class="tag is-medium categorie {% if filter_tag == tag.slug %}is-primary{% endif %}">{{tag.name}}</span></a>
{% endfor %}
</div>
</div>
</div>
<div class="columns">
{% for rom in roms %}
<div class="column is-one-quarter">
<a class="box has-text-centered">
<img src="{% get_media_prefix %}/{{rom.cover.small}}" />
<h1 class="title is-4">{{ rom.name }}</h1>
</a>
</div>
{% if forloop.counter|divisibleby:4 %}
</div>
<div class="columns">
{% endif %}
{% endfor %}
</div>
</div>
{% endblock %}

View File

@ -1,8 +1,12 @@
from django.conf.urls import include, url from django.conf.urls import include, url
from roms.views import RomListJson, RomDetailViewJson from roms.views import RomListJson, RomDetailViewJson, RomList
urlpatterns = [ urlpatterns = [
url(r'json/$', RomListJson.as_view()), url(r'^json/list/$', RomListJson.as_view()),
url(r'json/(?P<id>[0-9]+)/$', RomDetailViewJson.as_view()) url(r'^json/list/(?P<tag>[a-zA-Z0-9-]+)/$', RomListJson.as_view()),
url(r'^json/details/(?P<id>[0-9]+)/$', RomDetailViewJson.as_view()),
url(r'^list/$', RomList.as_view(), name='romlist'),
url(r'^list/(?P<tag>[a-zA-Z0-9-]+)/$', RomList.as_view(), name='romlist')
] ]

View File

@ -2,24 +2,66 @@ from django.views.generic.list import ListView
from django.views.generic.detail import DetailView from django.views.generic.detail import DetailView
from django.http import JsonResponse from django.http import JsonResponse
from taggit.models import Tag
from roms.models import Rom from roms.models import Rom
class RomListJson(ListView): class RomList(ListView):
template_name = 'roms/list.html'
context_object_name = 'roms'
def get_queryset(self): 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): def render_to_response(self, context, **response_kwargs):
queryset = self.get_queryset() 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: for rom in queryset:
json[rom.id] = rom.name json['roms'][rom.id] = rom.name
return JsonResponse(json, **response_kwargs, safe=False) return JsonResponse(json, **response_kwargs, safe=False)
class RomDetailViewJson(DetailView): class RomDetailViewJson(DetailView):
model = Rom model = Rom
pk_url_kwarg = 'id' pk_url_kwarg = 'id'

View File

@ -19,7 +19,7 @@
<img src="{% static "images/logo.png" %}"/> <img src="{% static "images/logo.png" %}"/>
</a> </a>
<a class="nav-item is-tab is-hidden-mobile {% block nav_rom_class %}{% endblock %}" <a class="nav-item is-tab is-hidden-mobile {% block nav_rom_class %}{% endblock %}"
href=""> href="{% url 'romlist' %}">
Roms Roms
</a> </a>
{% if user.is_authenticated %} {% if user.is_authenticated %}
@ -37,7 +37,7 @@
<div class="nav-right nav-menu"> <div class="nav-right nav-menu">
<a class="nav-item is-tab is-hidden-tablet {% block nav_mobile_rom_class %}{% endblock %}" <a class="nav-item is-tab is-hidden-tablet {% block nav_mobile_rom_class %}{% endblock %}"
href=""> href="{% url 'romlist' %}">
Roms Roms
</a> </a>
{% if user.is_authenticated %} {% if user.is_authenticated %}

View File

@ -0,0 +1,25 @@
# -*- 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
class Migration(migrations.Migration):
dependencies = [
('users', '0002_auto_20170428_1743'),
]
operations = [
migrations.AlterField(
model_name='user',
name='github',
field=models.CharField(blank=True, max_length=128, verbose_name='github'),
),
migrations.AlterField(
model_name='user',
name='twitter',
field=models.CharField(blank=True, max_length=128, verbose_name='twitter'),
),
]