Added form for uploading new roms

This commit is contained in:
Sebastian 2017-05-14 01:53:16 +02:00
parent 06f5eb43cd
commit 62c35a3b0d
9 changed files with 312 additions and 5 deletions

1
.gitignore vendored
View File

@ -2,3 +2,4 @@
*.sqlite3
__pycache__
virtenv
/media

View File

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

View File

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

View File

@ -3,12 +3,15 @@ import uuid
from django.db import models
from django.core.exceptions import ValidationError
from django.core.urlresolvers import reverse
from taggit.managers import TaggableManager
from stdimage.models import StdImageField
from stdimage.validators import MinSizeValidator
from users.models import User
def upload_cover_to(instance, filename):
_, ext = os.path.splitext(filename)
return "covers/%s%s" % (uuid.uuid4(), ext)
@ -27,11 +30,14 @@ class Rom(models.Model):
'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", default=False)
tags = TaggableManager(blank = True)
user = models.ForeignKey(User, blank=True, null=True)
creation_time = models.DateTimeField("creation time", auto_now_add = 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):
return [t.name for t in self.tags.all()]
@ -40,6 +46,7 @@ class Rom(models.Model):
json = {
'id' : self.pk,
'name' : self.name,
'user' : self.user.name,
'description' : self.description,
'tags' : self.tag_list(),
'low_binary' : self.low_binary.url,

View File

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

View File

@ -1,6 +1,6 @@
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 = [
url(r'^json/list/$', RomListJson.as_view()),
@ -9,5 +9,6 @@ urlpatterns = [
url(r'^list/$', 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')
]

View File

@ -1,6 +1,10 @@
from django.views.generic.list import ListView
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.contrib.auth import get_user_model
from django.db.models import Q
from taggit.models import Tag
@ -37,10 +41,28 @@ class RomDetailView(DetailView):
context_object_name = 'rom'
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
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):
def get_queryset(self):

View File

@ -4288,3 +4288,6 @@ label.panel-block {
.tab-body {
padding-left: 1vw;
}
.hidden {
display: none;
}

View File

@ -8,7 +8,7 @@
<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" %}">
<script src="{% static "jquery-3.2.1.slim.min.js" %}"></script>
<script src="{% static "js/jquery-3.2.1.slim.min.js" %}"></script>
</head>
<body>