diff --git a/anapneo/neo/admin.py b/anapneo/neo/admin.py index a5a2bde..937f1b4 100644 --- a/anapneo/neo/admin.py +++ b/anapneo/neo/admin.py @@ -3,7 +3,7 @@ class UserProfileAdmin(admin.ModelAdmin): - list_display = ['user', 'email', 'first_name', 'last_name', 'city', + list_display = ['display_name', 'get_user_mail', 'first_name', 'last_name', 'city', 'country', 'lat', 'lon'] admin.site.register(UserProfile, UserProfileAdmin) @@ -13,7 +13,7 @@ class FeedbackInline(admin.TabularInline): extra = 2 class NeoAdmin(admin.ModelAdmin): - list_display = ['user', 'no','score', 'observation_date', 'position_ra', + list_display = ['get_user_display_name', 'no','score', 'observation_date', 'position_ra', 'position_dec', 'magnitude', 'updated', 'note', 'num_obs', 'arc', 'nominal_h', 'image', 'number_of_votes_yes', 'number_of_votes_no', 'number_of_votes_total'] diff --git a/anapneo/neo/models.py b/anapneo/neo/models.py index 2c2b37e..04182f4 100644 --- a/anapneo/neo/models.py +++ b/anapneo/neo/models.py @@ -9,7 +9,6 @@ class UserProfile(models.Model): user = models.ForeignKey(User, unique=True) - email = models.EmailField(max_length=100) display_name = models.CharField(max_length=50, unique=True, validators=[ RegexValidator(regex=r'("")|(^[a-z0-9_]+$)', @@ -21,10 +20,17 @@ class UserProfile(models.Model): country = models.CharField(max_length=40, blank=True, verbose_name="Country") lat = models.CharField(max_length=20, blank=True, verbose_name="Latitude") lon = models.CharField(max_length=20, blank=True, verbose_name="Longitude") - + + def get_user_mail(self): + return self.user.email + get_user_mail.short_description = 'email' + + def __unicode__(self): + return str(self.display_name) + class Neo(models.Model): - user = models.ForeignKey(User) + user = models.ForeignKey(UserProfile) no = models.IntegerField(verbose_name="ID", unique=True) score = models.PositiveIntegerField(verbose_name="Score (%)") observation_date = models.DateTimeField(verbose_name="Observation Date") @@ -38,6 +44,10 @@ class Neo(models.Model): arc = models.FloatField(verbose_name="Arc", validators=[MinValueValidator(0.0)]) nominal_h = models.FloatField(verbose_name="Nominal H", blank=True, validators=[MinValueValidator(0.0)]) image = models.ImageField(upload_to='.', verbose_name="Image", blank=True) + + def get_user_display_name(self): + return self.user.display_name + get_user_display_name.short_description = 'display name' def number_of_feedback(self): return self.feedback_set.count() @@ -76,6 +86,7 @@ def __unicode__(self): class Meta: ordering = ['no'] + class Feedback(models.Model): diff --git a/anapneo/neo/views.py b/anapneo/neo/views.py index a5a1d51..cdc1836 100644 --- a/anapneo/neo/views.py +++ b/anapneo/neo/views.py @@ -1,20 +1,18 @@ from django.shortcuts import render, get_object_or_404, get_list_or_404, redirect from django.contrib.auth.models import User from django.core.paginator import Paginator, InvalidPage, EmptyPage +from django.template import RequestContext from anapneo.neo.models import UserProfile, Neo, Feedback from anapneo.neo.forms import NeoForm, UserProfileForm, FeedbackForm from anapneo.decorators import is_logged_in +from django.db.models import Q from datetime import datetime def index(request): - neo_list = Neo.objects.all().extra( - select={ - 'display_name': 'SELECT display_name FROM neo_userprofile WHERE neo_userprofile.id = neo_neo.user_id' - }, - ).order_by('-no')[:7] + neo_list = Neo.objects.all().order_by('-no')[:7] if request.user.is_authenticated(): me = UserProfile.objects.get(user=request.user) return render(request, 'index.html', {'me': me, 'neo_list': neo_list}) @@ -28,11 +26,13 @@ def dashboard(request): except UserProfile.DoesNotExist: display_name = request.user return redirect('/register/') - neos = Neo.objects.all().extra( - select={ - 'display_name': 'SELECT display_name FROM neo_userprofile WHERE neo_userprofile.id = neo_neo.user_id' - }, - ) + + # Search form + if request.method == 'POST': + q = request.POST['query'] + neos = filter_neos(q) + else: + neos = Neo.objects.all() paginator = Paginator(neos, 50) # Make sure page request is an int. If not, deliver first page. @@ -48,7 +48,35 @@ def dashboard(request): if request.user.is_authenticated(): return render(request, 'dashboard.html', {'neo_list': neo_list, 'page': page, 'me': me}) - return render(request, 'dashboard.html', {'neo_list': neo_list, 'page': page}) + return render(request, 'dashboard.html', {'neo_list': neo_list, 'page': page}, + context_instance=RequestContext(request)) + + +# It is used for searching in dashboard thus +# neo_fields MUST be the same with fields +# displayed in dashboard.html +def filter_neos(query): + str_fields = ['no', + #'observation_date', # No date fields included + 'score', + 'user__display_name', + 'position_ra', + 'position_dec', + 'magnitude', + #'updated', + 'num_obs', + 'arc', + 'nominal_h'] + + or_query = None + for f in str_fields: + q = Q(**{"%s__contains" % f : query}) + if or_query is None: + or_query = q + else: + or_query = or_query | q + + return Neo.objects.filter(or_query) @is_logged_in diff --git a/anapneo/templates/base.html b/anapneo/templates/base.html index 75db396..d829a2e 100644 --- a/anapneo/templates/base.html +++ b/anapneo/templates/base.html @@ -33,7 +33,7 @@ - anapNEO + anapNEO