diff --git a/db/base/admin.py b/db/base/admin.py index 9095467..f73b8a7 100644 --- a/db/base/admin.py +++ b/db/base/admin.py @@ -1,18 +1,27 @@ from django.contrib import admin -from db.base.models import Satellite, Transponder +from db.base.models import Satellite, Transponder, Suggestion +@admin.register(Satellite) class SatelliteAdmin(admin.ModelAdmin): list_display = ('name', 'norad_cat_id') +@admin.register(Transponder) class TransponderAdmin(admin.ModelAdmin): list_display = ('description', 'satellite', 'uplink_low', 'uplink_high', 'downlink_low', 'downlink_high') search_fields = ('satellite', ) - list_filter = ('mode', 'invert', 'approved') + list_filter = ('mode', 'invert') -admin.site.register(Satellite, SatelliteAdmin) -admin.site.register(Transponder, TransponderAdmin) +@admin.register(Suggestion) +class SuggestionAdmin(admin.ModelAdmin): + list_display = ('description', 'suggestion', 'user', 'satellite', 'uplink_low', + 'uplink_high', 'downlink_low', 'downlink_high', 'approved') + search_fields = ('satellite', 'approved') + list_filter = ('mode', 'invert') + + def get_queryset(self, request): + return Transponder.objects_all.filter(approved=False) diff --git a/db/base/forms.py b/db/base/forms.py new file mode 100644 index 0000000..3e06c03 --- /dev/null +++ b/db/base/forms.py @@ -0,0 +1,14 @@ +from django import forms +from django.forms import ModelForm + +from db.base.models import Transponder + + +class SatelliteSearchForm(forms.Form): + term = forms.CharField() + + +class TransponderSuggestionForm(forms.ModelForm): + class Meta: + model = Transponder + exclude = ['approved'] diff --git a/db/base/management/commands/initialize.py b/db/base/management/commands/initialize.py index 1668707..33a7914 100644 --- a/db/base/management/commands/initialize.py +++ b/db/base/management/commands/initialize.py @@ -10,7 +10,7 @@ class Command(BaseCommand): help = 'Create initial fixtures' def handle(self, *args, **options): - TransponderFactory.create_batch(20, suggestion=None) + TransponderFactory.create_batch(20, suggestion=None, approved=True, user=None) satellites = Satellite.objects.all() diff --git a/db/base/migrations/0002_auto_20150425_1633.py b/db/base/migrations/0002_auto_20150425_1633.py new file mode 100644 index 0000000..bce39d8 --- /dev/null +++ b/db/base/migrations/0002_auto_20150425_1633.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations +import django.db.models.deletion +from django.conf import settings + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('base', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='Suggestion', + fields=[ + ], + options={ + 'proxy': True, + }, + bases=('base.transponder',), + ), + migrations.AddField( + model_name='transponder', + name='citation', + field=models.URLField(max_length=255, blank=True), + ), + migrations.AddField( + model_name='transponder', + name='user', + field=models.ForeignKey(on_delete=django.db.models.deletion.SET_NULL, blank=True, to=settings.AUTH_USER_MODEL, null=True), + ), + migrations.AlterField( + model_name='transponder', + name='satellite', + field=models.ForeignKey(related_name='transponders', to='base.Satellite', null=True), + ), + ] diff --git a/db/base/models.py b/db/base/models.py index 9403630..a8f6007 100644 --- a/db/base/models.py +++ b/db/base/models.py @@ -1,17 +1,23 @@ from django.core.validators import MinValueValidator from django.db import models +from django.contrib.auth.models import User MODE_CHOICES = ['FM', 'AFSK', 'BFSK', 'APRS', 'SSTV', 'CW', 'FMN'] +class TransponderApprovedManager(models.Manager): + def get_queryset(self): + return super(TransponderApprovedManager, self).get_queryset().filter(approved=True) + + class Satellite(models.Model): """Model for SatNOGS satellites.""" norad_cat_id = models.PositiveIntegerField() name = models.CharField(max_length=45) def __unicode__(self): - return self.name + return '{0} - {1}'.format(self.norad_cat_id, self.name) class Transponder(models.Model): @@ -26,12 +32,23 @@ class Transponder(models.Model): max_length=10) invert = models.BooleanField(default=False) baud = models.FloatField(validators=[MinValueValidator(0)]) - satellite = models.ForeignKey(Satellite, related_name='transponder', + satellite = models.ForeignKey(Satellite, related_name='transponders', null=True) approved = models.BooleanField(default=False) suggestion = models.ForeignKey('self', blank=True, null=True, on_delete=models.SET_NULL, related_name="suggestions") + citation = models.URLField(max_length=255, blank=True) + user = models.ForeignKey(User, blank=True, null=True, + on_delete=models.SET_NULL) + + objects = TransponderApprovedManager() + objects_all = models.Manager() def __unicode__(self): return self.description + + +class Suggestion(Transponder): + class Meta: + proxy = True diff --git a/db/base/tests.py b/db/base/tests.py index c6ef9a4..2589d91 100644 --- a/db/base/tests.py +++ b/db/base/tests.py @@ -1,9 +1,19 @@ +from django.contrib.auth.models import User + import factory from factory import fuzzy from db.base.models import MODE_CHOICES, Satellite, Transponder +class UserFactory(factory.django.DjangoModelFactory): + """User model factory""" + username = factory.Sequence(lambda n: "user_%d" % n) + + class Meta: + model = User + + class SatelliteFactory(factory.django.DjangoModelFactory): """Sattelite model factory.""" norad_cat_id = fuzzy.FuzzyInteger(2000, 4000) @@ -26,6 +36,8 @@ class TransponderFactory(factory.django.DjangoModelFactory): satellite = factory.SubFactory(SatelliteFactory) approved = fuzzy.FuzzyChoice(choices=[True, False]) suggestion = factory.SubFactory('db.base.tests.TransponderFactory') + citation = fuzzy.FuzzyText() + user = factory.SubFactory('db.base.tests.UserFactory') class Meta: model = Transponder diff --git a/db/base/urls.py b/db/base/urls.py index 34980eb..8fb2f21 100644 --- a/db/base/urls.py +++ b/db/base/urls.py @@ -3,4 +3,5 @@ from django.conf.urls import patterns, url urlpatterns = patterns( 'db.base.views', url(r'^$', 'home', name='home'), + url(r'^suggestion/$', 'suggestion', name='suggestion'), ) diff --git a/db/base/views.py b/db/base/views.py index dd34a1d..eb235a2 100644 --- a/db/base/views.py +++ b/db/base/views.py @@ -1,15 +1,54 @@ -from django.shortcuts import render +from django.shortcuts import render, redirect, get_object_or_404 from django.contrib.auth.models import User +from django.views.decorators.http import require_POST +from django.contrib.auth.decorators import login_required +from django.contrib import messages +from django.core.urlresolvers import reverse -from db.base.models import Transponder, Satellite + +from db.base.models import Transponder, Satellite, MODE_CHOICES +from db.base.forms import SatelliteSearchForm, TransponderSuggestionForm def home(request): - """View to render index page.""" satellites = Satellite.objects.all() transponders = Transponder.objects.all() contributors = User.objects.filter(is_active=1) + if request.method == 'POST': + satellite_form = SatelliteSearchForm(request.POST) + if satellite_form.is_valid(): + term = satellite_form.cleaned_data['term'] + norad_cat_id = term.split()[0] + try: + satellite = Satellite.objects.get(norad_cat_id=norad_cat_id) + except: + messages.error(request, 'Please select one of the available Satellites') + return redirect(reverse('home')) + + return render(request, 'base/home.html', {'satellites': satellites, + 'transponders': transponders, + 'satellite': satellite, + 'contributors': contributors, + 'satellite_form': satellite_form, + 'modes': MODE_CHOICES}) + return render(request, 'base/home.html', {'satellites': satellites, 'transponders': transponders, 'contributors': contributors}) + + +@login_required +@require_POST +def suggestion(request): + suggestion_form = TransponderSuggestionForm(request.POST) + if suggestion_form.is_valid(): + suggestion = suggestion_form.save(commit=False) + suggestion.user = request.user + suggestion.save() + + messages.success(request, 'Your suggestion was stored successfully. Thanks for contibuting!') + return redirect(reverse('home')) + + messages.error(request, 'We are sorry, but some error occured :(') + return redirect(reverse('home')) diff --git a/db/static/js/app.js b/db/static/js/app.js index 4b9e512..21e725b 100644 --- a/db/static/js/app.js +++ b/db/static/js/app.js @@ -1,4 +1,17 @@ $(document).ready(function() { 'use strict'; + $('#search-input').focus(); + + $('#search-input').keypress(function (e) { + if (e.which == 13) { + $('#search-form').submit(); + return false; + } + }); + + $('#search-button').click(function (e) { + $('#search-form').submit(); + return false; + }); }); diff --git a/db/templates/base/home.html b/db/templates/base/home.html index ca76f0e..b6b6b21 100644 --- a/db/templates/base/home.html +++ b/db/templates/base/home.html @@ -20,34 +20,42 @@ -
-
- {% for sat in satellites %} + {% if satellite %} +
+

- {{ sat.norad_cat_id }} {{ sat.name }} + {{ satellite }}

- {% for transponder in sat.transponder.all %} + {% for transponder in satellite.transponders.all %}
@@ -57,7 +65,7 @@ @@ -65,19 +73,170 @@
- {{ transponder.key }} - {{ transponder.value }} + Uplink Low + {{ transponder.uplink_low }} - {{ transponder.approved }}
+ + + {% endfor %}
- {% endfor %} +
-
+ + + + {% endif %}
diff --git a/db/urls.py b/db/urls.py index b942204..6cd4b25 100644 --- a/db/urls.py +++ b/db/urls.py @@ -9,7 +9,7 @@ urlpatterns = patterns( '', # Base - url(r'^$', include('db.base.urls')), + url(r'^', include('db.base.urls')), # Accounts url(r'^accounts/', include('allauth.urls')),