Added form for uploading new roms
This commit is contained in:
parent
06f5eb43cd
commit
62c35a3b0d
|
@ -2,3 +2,4 @@
|
||||||
*.sqlite3
|
*.sqlite3
|
||||||
__pycache__
|
__pycache__
|
||||||
virtenv
|
virtenv
|
||||||
|
/media
|
||||||
|
|
|
@ -0,0 +1,24 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Generated by Django 1.10.5 on 2017-05-13 22:25
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from django.conf import settings
|
||||||
|
from django.db import migrations, models
|
||||||
|
import django.db.models.deletion
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||||
|
('roms', '0004_auto_20170508_2136'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='rom',
|
||||||
|
name='user',
|
||||||
|
field=models.ForeignKey(default=2, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL),
|
||||||
|
preserve_default=False,
|
||||||
|
),
|
||||||
|
]
|
|
@ -0,0 +1,27 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Generated by Django 1.10.5 on 2017-05-13 23:44
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from django.conf import settings
|
||||||
|
from django.db import migrations, models
|
||||||
|
import django.db.models.deletion
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('roms', '0005_rom_user'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='rom',
|
||||||
|
name='approved',
|
||||||
|
field=models.BooleanField(default=False, verbose_name='approved'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='rom',
|
||||||
|
name='user',
|
||||||
|
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL),
|
||||||
|
),
|
||||||
|
]
|
|
@ -3,12 +3,15 @@ import uuid
|
||||||
|
|
||||||
from django.db import models
|
from django.db import models
|
||||||
from django.core.exceptions import ValidationError
|
from django.core.exceptions import ValidationError
|
||||||
|
from django.core.urlresolvers import reverse
|
||||||
|
|
||||||
from taggit.managers import TaggableManager
|
from taggit.managers import TaggableManager
|
||||||
|
|
||||||
from stdimage.models import StdImageField
|
from stdimage.models import StdImageField
|
||||||
from stdimage.validators import MinSizeValidator
|
from stdimage.validators import MinSizeValidator
|
||||||
|
|
||||||
|
from users.models import User
|
||||||
|
|
||||||
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)
|
||||||
|
@ -27,11 +30,14 @@ class Rom(models.Model):
|
||||||
'small': {'width': 300, 'height': 300, 'crop': True}})
|
'small': {'width': 300, 'height': 300, 'crop': True}})
|
||||||
low_binary = models.FileField("low binary", upload_to = upload_binary_to)
|
low_binary = models.FileField("low binary", upload_to = upload_binary_to)
|
||||||
high_binary = models.FileField("high 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", default=False)
|
||||||
tags = TaggableManager(blank = True)
|
tags = TaggableManager(blank = True)
|
||||||
|
user = models.ForeignKey(User, blank=True, null=True)
|
||||||
creation_time = models.DateTimeField("creation time", auto_now_add = True)
|
creation_time = models.DateTimeField("creation time", auto_now_add = True)
|
||||||
edit_time = models.DateTimeField("edit time", auto_now = True)
|
edit_time = models.DateTimeField("edit time", auto_now = True)
|
||||||
|
|
||||||
|
def get_absolute_url(self):
|
||||||
|
return reverse('romdetails', kwargs={'id' : self.pk})
|
||||||
|
|
||||||
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()]
|
||||||
|
@ -40,6 +46,7 @@ class Rom(models.Model):
|
||||||
json = {
|
json = {
|
||||||
'id' : self.pk,
|
'id' : self.pk,
|
||||||
'name' : self.name,
|
'name' : self.name,
|
||||||
|
'user' : self.user.name,
|
||||||
'description' : self.description,
|
'description' : self.description,
|
||||||
'tags' : self.tag_list(),
|
'tags' : self.tag_list(),
|
||||||
'low_binary' : self.low_binary.url,
|
'low_binary' : self.low_binary.url,
|
||||||
|
|
|
@ -0,0 +1,222 @@
|
||||||
|
{% extends "base.html" %}
|
||||||
|
|
||||||
|
{% block title %}Rom Hochladen{% endblock %}
|
||||||
|
{% block nav_rom_upload_class %}is-active{% endblock %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
|
||||||
|
<div class="rom-overview">
|
||||||
|
<div class="columns">
|
||||||
|
<div class="column">
|
||||||
|
<div class="box">
|
||||||
|
<h1 class="title is-1">Neues Rom Hochladen</h1>
|
||||||
|
{% if form.non_field_errors %}
|
||||||
|
<div class="message is-danger">
|
||||||
|
<div class="message-header">
|
||||||
|
<strong>Nope!</strong>
|
||||||
|
</div>
|
||||||
|
<div class="message-body">
|
||||||
|
{{ form.non_field_errors }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<form enctype="multipart/form-data" method="post">
|
||||||
|
{% csrf_token %}
|
||||||
|
<div class="field is-horizontal">
|
||||||
|
<div class="field-label is-normal">
|
||||||
|
<label class="label" for="{{form.name.id_for_label}}">{{form.name.label}}</label>
|
||||||
|
</div>
|
||||||
|
<div class="field-body">
|
||||||
|
<div class="field is-narrow">
|
||||||
|
<div class="control has-icons-left has-icons-right">
|
||||||
|
<input class="input {% if form.name.errors %}is-danger{% endif %} is-primary"
|
||||||
|
type="text" name="{{form.name.html_name}}"
|
||||||
|
id="{{form.name.id_for_label}}" value="{{form.name.value|default_if_none:''}}" />
|
||||||
|
<span class="icon is-small is-left">
|
||||||
|
<i class="fa fa-chevron-right"></i>
|
||||||
|
</span>
|
||||||
|
<span class="icon is-small is-right">
|
||||||
|
{% if form.name.errors %}
|
||||||
|
<i class="fa fa-warning"></i>
|
||||||
|
{% endif %}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<p class="help is-danger">
|
||||||
|
{{form.name.errors.as_text}}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="field is-horizontal">
|
||||||
|
<div class="field-label is-normal">
|
||||||
|
<label class="label" for="{{form.tags.id_for_label}}">{{form.tags.label}}</label>
|
||||||
|
</div>
|
||||||
|
<div class="field-body">
|
||||||
|
<div class="field is-narrow">
|
||||||
|
<div class="control has-icons-left has-icons-right">
|
||||||
|
<input class="input {% if form.tags.errors %}is-danger{% endif %}"
|
||||||
|
type="text" name="{{form.tags.html_name}}"
|
||||||
|
id="{{form.tags.id_for_label}}" value="{{form.tags.value|default_if_none:''}}" />
|
||||||
|
<span class="icon is-small is-left">
|
||||||
|
<i class="fa fa-tags"></i>
|
||||||
|
</span>
|
||||||
|
<span class="icon is-small is-right">
|
||||||
|
{% if form.tags.errors %}
|
||||||
|
<i class="fa fa-warning"></i>
|
||||||
|
{% endif %}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<p class="help is-danger">
|
||||||
|
{{form.tags.errors.as_text}}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="field is-horizontal">
|
||||||
|
<div class="field-label is-normal">
|
||||||
|
<label class="label" for="{{form.description.id_for_label}}">{{form.description.label}}</label>
|
||||||
|
</div>
|
||||||
|
<div class="field-body">
|
||||||
|
<div class="field">
|
||||||
|
<p class="control">
|
||||||
|
<textarea name="{{form.description.html_name}}"
|
||||||
|
id="{{form.description.id_for_label}}"
|
||||||
|
class="textarea {% if form.description.errors %}is-danger{% endif %} is-primary">{{form.description.value|default_if_none:''}}</textarea>
|
||||||
|
</p>
|
||||||
|
<p class="help is-danger">
|
||||||
|
{{form.description.errors.as_text}}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="field is-horizontal">
|
||||||
|
<div class="field-label is-normal">
|
||||||
|
<label class="label" for="{{form.cover.id_for_label}}">{{form.cover.label}}</label>
|
||||||
|
</div>
|
||||||
|
<div class="field-body">
|
||||||
|
<div class="field is-narrow has-addons">
|
||||||
|
<input class="hidden" type="file" name="{{form.cover.html_name}}" id="{{form.cover.id_for_label}}" value="{{form.cover.value|default_if_none:''}}" />
|
||||||
|
|
||||||
|
<div class="control has-icons-left has-icons-right">
|
||||||
|
<input class="input {% if form.cover.errors %}is-danger{% endif %} is-primary"
|
||||||
|
type="text" value="{{form.cover.value|default_if_none:''}}" />
|
||||||
|
<span class="icon is-small is-left">
|
||||||
|
<i class="fa fa-picture-o"></i>
|
||||||
|
</span>
|
||||||
|
<span class="icon is-small is-right">
|
||||||
|
{% if form.cover.errors %}
|
||||||
|
<i class="fa fa-warning"></i>
|
||||||
|
{% endif %}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div class="control">
|
||||||
|
<a class="button is-primary">
|
||||||
|
Durchsuchen
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<p class="help is-danger">
|
||||||
|
{{form.cover.errors.as_text}}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="field is-horizontal">
|
||||||
|
<div class="field-label is-normal">
|
||||||
|
<label class="label" for="{{form.high_binary.id_for_label}}">{{form.high_binary.label}}</label>
|
||||||
|
</div>
|
||||||
|
<div class="field-body">
|
||||||
|
<div class="field is-narrow has-addons">
|
||||||
|
<input class="hidden" type="file" name="{{form.high_binary.html_name}}" id="{{form.high_binary.id_for_label}}" value="{{form.high_binary.value|default_if_none:''}}" />
|
||||||
|
|
||||||
|
<div class="control has-icons-left has-icons-right">
|
||||||
|
<input class="input {% if form.high_binary.errors %}is-danger{% endif %} is-primary"
|
||||||
|
type="text" value="{{form.high_binary.value|default_if_none:''}}" />
|
||||||
|
<span class="icon is-small is-left">
|
||||||
|
<i class="fa fa-microchip"></i>
|
||||||
|
</span>
|
||||||
|
<span class="icon is-small is-right">
|
||||||
|
{% if form.high_binary.errors %}
|
||||||
|
<i class="fa fa-warning"></i>
|
||||||
|
{% endif %}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div class="control">
|
||||||
|
<a class="button is-primary">
|
||||||
|
Durchsuchen
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<p class="help is-danger">
|
||||||
|
{{form.high_binary.errors.as_text}}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<div class="field is-horizontal">
|
||||||
|
<div class="field-label is-normal">
|
||||||
|
<label class="label" for="{{form.low_binary.id_for_label}}">{{form.low_binary.label}}</label>
|
||||||
|
</div>
|
||||||
|
<div class="field-body">
|
||||||
|
<div class="field is-narrow has-addons">
|
||||||
|
<input class="hidden" type="file" name="{{form.low_binary.html_name}}" id="{{form.low_binary.id_for_label}}" value="{{form.low_binary.value|default_if_none:''}}" />
|
||||||
|
|
||||||
|
<div class="control has-icons-left has-icons-right">
|
||||||
|
<input class="input {% if form.low_binary.errors %}is-danger{% endif %} is-primary"
|
||||||
|
type="text" value="{{form.low_binary.value|default_if_none:''}}" />
|
||||||
|
<span class="icon is-small is-left">
|
||||||
|
<i class="fa fa-microchip"></i>
|
||||||
|
</span>
|
||||||
|
<span class="icon is-small is-right">
|
||||||
|
{% if form.low_binary.errors %}
|
||||||
|
<i class="fa fa-warning"></i>
|
||||||
|
{% endif %}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div class="control">
|
||||||
|
<a class="button is-primary">
|
||||||
|
Durchsuchen
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<p class="help is-danger">
|
||||||
|
{{form.low_binary.errors.as_text}}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="field is-grouped">
|
||||||
|
<p class="control">
|
||||||
|
<button class="button is-primary">Hochladen</button>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script type="text/javascript">
|
||||||
|
$(document).ready(function() {
|
||||||
|
$("input[type='file']").each(function () {
|
||||||
|
var fileField = $(this);
|
||||||
|
var textField = fileField.next('.control').find('input');
|
||||||
|
var button = fileField.next('.control').next('.control').find('a');
|
||||||
|
|
||||||
|
|
||||||
|
fileField.change(function() {
|
||||||
|
textField.val(fileField.val());
|
||||||
|
});
|
||||||
|
|
||||||
|
button.click(function() {
|
||||||
|
fileField.click()
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
{% endblock %}
|
|
@ -1,6 +1,6 @@
|
||||||
from django.conf.urls import include, url
|
from django.conf.urls import include, url
|
||||||
|
|
||||||
from roms.views import RomListJson, RomDetailViewJson, RomList, RomDetailView
|
from roms.views import RomListJson, RomDetailViewJson, RomList, RomDetailView, RomCreateView
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
url(r'^json/list/$', RomListJson.as_view()),
|
url(r'^json/list/$', RomListJson.as_view()),
|
||||||
|
@ -9,5 +9,6 @@ urlpatterns = [
|
||||||
|
|
||||||
url(r'^list/$', RomList.as_view(), name = 'romlist'),
|
url(r'^list/$', RomList.as_view(), name = 'romlist'),
|
||||||
url(r'^list/(?P<tag>[a-zA-Z0-9-]+)/$', RomList.as_view(), name = 'romlist'),
|
url(r'^list/(?P<tag>[a-zA-Z0-9-]+)/$', RomList.as_view(), name = 'romlist'),
|
||||||
url(r'^details/(?P<id>[0-9]+)/$', RomDetailView.as_view(), name = 'romdetails')
|
url(r'^details/(?P<id>[0-9]+)/$', RomDetailView.as_view(), name = 'romdetails'),
|
||||||
|
url(r'^new/$', RomCreateView.as_view(), name = 'romcreate')
|
||||||
]
|
]
|
||||||
|
|
|
@ -1,6 +1,10 @@
|
||||||
from django.views.generic.list import ListView
|
from django.views.generic.list import ListView
|
||||||
from django.views.generic.detail import DetailView
|
from django.views.generic.detail import DetailView
|
||||||
|
from django.views.generic.edit import CreateView
|
||||||
|
from django.contrib.auth.mixins import LoginRequiredMixin
|
||||||
from django.http import JsonResponse
|
from django.http import JsonResponse
|
||||||
|
from django.contrib.auth import get_user_model
|
||||||
|
from django.db.models import Q
|
||||||
|
|
||||||
from taggit.models import Tag
|
from taggit.models import Tag
|
||||||
|
|
||||||
|
@ -37,10 +41,28 @@ class RomDetailView(DetailView):
|
||||||
context_object_name = 'rom'
|
context_object_name = 'rom'
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
queryset = Rom.objects.all().filter(approved = True)
|
queryset = Rom.objects.all().filter(Q(approved = True) | Q(user__id = self.request.user.id))
|
||||||
return queryset
|
return queryset
|
||||||
|
|
||||||
|
|
||||||
|
class RomCreateView(LoginRequiredMixin, CreateView):
|
||||||
|
model = Rom
|
||||||
|
fields = ['name', 'description', 'cover', 'low_binary', 'high_binary', 'tags']
|
||||||
|
template_name = 'roms/create.html'
|
||||||
|
|
||||||
|
def get_queryset(self):
|
||||||
|
return Rom.objects.filtered(user__id = request.user.id)
|
||||||
|
|
||||||
|
def form_valid(self, form):
|
||||||
|
res = super(RomCreateView, self).form_valid(form)
|
||||||
|
|
||||||
|
self.object.user = self.request.user
|
||||||
|
self.object.save()
|
||||||
|
|
||||||
|
return res
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class RomListJson(ListView):
|
class RomListJson(ListView):
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
|
|
|
@ -4288,3 +4288,6 @@ label.panel-block {
|
||||||
.tab-body {
|
.tab-body {
|
||||||
padding-left: 1vw;
|
padding-left: 1vw;
|
||||||
}
|
}
|
||||||
|
.hidden {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
<link rel="stylesheet" type="text/css" href="{% static "css/gulasch_bulma.css" %}">
|
<link rel="stylesheet" type="text/css" href="{% static "css/gulasch_bulma.css" %}">
|
||||||
<link rel="stylesheet" type="text/css" href="{% static "fontawsome/css/font-awesome.min.css" %}">
|
<link rel="stylesheet" type="text/css" href="{% static "fontawsome/css/font-awesome.min.css" %}">
|
||||||
|
|
||||||
<script src="{% static "jquery-3.2.1.slim.min.js" %}"></script>
|
<script src="{% static "js/jquery-3.2.1.slim.min.js" %}"></script>
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
|
|
Loading…
Reference in New Issue