Added list view for roms
This commit is contained in:
parent
4b69cd0251
commit
ff5318b7aa
|
@ -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
|
||||||
|
|
|
@ -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),
|
||||||
|
|
|
@ -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
|
|
@ -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,
|
||||||
|
),
|
||||||
|
]
|
|
@ -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'),
|
||||||
|
),
|
||||||
|
]
|
|
@ -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
|
||||||
|
|
|
@ -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 %}
|
10
roms/urls.py
10
roms/urls.py
|
@ -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')
|
||||||
]
|
]
|
||||||
|
|
|
@ -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'
|
||||||
|
|
|
@ -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 %}
|
||||||
|
|
|
@ -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'),
|
||||||
|
),
|
||||||
|
]
|
Loading…
Reference in New Issue