From 11863b50234b606a106a74214c328279ac0ad5c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felipe=20Mart=C3=ADn?= Date: Thu, 10 Sep 2015 22:31:55 +0200 Subject: [PATCH] Profile views --- amiibofindr/apps/profile/__init__.py | 0 amiibofindr/apps/profile/models.py | 0 amiibofindr/apps/profile/urls.py | 20 ++++ amiibofindr/apps/profile/views.py | 36 +++++++ amiibofindr/locale/es/LC_MESSAGES/django.po | 101 ++++++++++++++---- amiibofindr/settings/base.py | 1 + .../static/images/home/publicprofile.es.png | Bin 0 -> 19006 bytes amiibofindr/templates/_layout.html | 3 +- amiibofindr/templates/home/home.html | 8 ++ amiibofindr/templates/profile/main.html | 53 +++++++++ amiibofindr/urls.py | 1 + 11 files changed, 200 insertions(+), 23 deletions(-) create mode 100644 amiibofindr/apps/profile/__init__.py create mode 100644 amiibofindr/apps/profile/models.py create mode 100644 amiibofindr/apps/profile/urls.py create mode 100644 amiibofindr/apps/profile/views.py create mode 100644 amiibofindr/static/images/home/publicprofile.es.png create mode 100644 amiibofindr/templates/profile/main.html diff --git a/amiibofindr/apps/profile/__init__.py b/amiibofindr/apps/profile/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/amiibofindr/apps/profile/models.py b/amiibofindr/apps/profile/models.py new file mode 100644 index 0000000..e69de29 diff --git a/amiibofindr/apps/profile/urls.py b/amiibofindr/apps/profile/urls.py new file mode 100644 index 0000000..aa61f9c --- /dev/null +++ b/amiibofindr/apps/profile/urls.py @@ -0,0 +1,20 @@ +# coding: utf-8 + +# django +from django.conf.urls import url, patterns +from django.utils.translation import ugettext_lazy as _ + +# home +from .views import ProfileView + + +urlpatterns = patterns( + '', + url(_(r'^profile/(?P[\w\d\-]+)/$'), + ProfileView.as_view(), + name='main'), + url(_(r'^profile/(?P[\w\d\-]+)/(?P\w+)/(?P\w+)/$'), + ProfileView.as_view(), + name='main-filter'), + +) diff --git a/amiibofindr/apps/profile/views.py b/amiibofindr/apps/profile/views.py new file mode 100644 index 0000000..8146291 --- /dev/null +++ b/amiibofindr/apps/profile/views.py @@ -0,0 +1,36 @@ +# -*- coding: utf-8 -*- + +from django.contrib.auth import get_user_model +from django.views.generic.base import View +from django.shortcuts import render, get_object_or_404 + +from amiibofindr.apps.amiibo.models import UserAmiibo, AmiiboFigure, AmiiboCard + + +class ProfileView(View): + template = 'profile/main.html' + + types = { + 'figures': ('figure', AmiiboFigure), + 'cards': ('card', AmiiboCard), + } + + relations = ('own', 'want', 'trade', ) + + def get(self, request, username, type='figures', relation='own'): + user = get_object_or_404(get_user_model(), username=username) + relation_filter = {relation: True} + amiibo_pks = UserAmiibo.objects.filter( + user=user, + _amiibo__type=self.types[type][0], + **relation_filter + ).values_list('_amiibo__id', flat=True) + + amiibo_list = self.types[type][1].objects.filter(pk__in=amiibo_pks) + + return render(request, self.template, { + 'this_user': user, + 'amiibo_list': amiibo_list, + 'type': type, + 'relation': relation + }) diff --git a/amiibofindr/locale/es/LC_MESSAGES/django.po b/amiibofindr/locale/es/LC_MESSAGES/django.po index 20c8697..72ffcb5 100644 --- a/amiibofindr/locale/es/LC_MESSAGES/django.po +++ b/amiibofindr/locale/es/LC_MESSAGES/django.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-09-10 21:36+0200\n" -"PO-Revision-Date: 2015-09-10 21:38+0200\n" +"POT-Creation-Date: 2015-09-10 22:30+0200\n" +"PO-Revision-Date: 2015-09-10 22:30+0200\n" "Last-Translator: \n" "Language-Team: \n" "Language: es\n" @@ -210,6 +210,14 @@ msgstr "" msgid "^amiibo/(?P\\d+)/(?P[\\w\\+\\-\\=]+)$" msgstr "^amiibo/(?P\\d+)/(?P[\\w\\+\\-\\=]+)$" +#: apps/profile/urls.py:13 +msgid "^profile/(?P[\\w\\d\\-]+)/$" +msgstr "^perfil/(?P[\\w\\d\\-]+)/$" + +#: apps/profile/urls.py:16 +msgid "^profile/(?P[\\w\\d\\-]+)/(?P\\w+)/(?P\\w+)/$" +msgstr "^perfil/(?P[\\w\\d\\-]+)/(?P\\w+)/(?P\\w+)/$" + #: templates/404.html:10 msgid "Not found!" msgstr "No encontrado." @@ -248,51 +256,57 @@ msgstr "" msgid "all" msgstr "todas" -#: templates/_layout.html:36 templates/_layout.html.py:104 +#: templates/_layout.html:36 templates/_layout.html.py:105 +#: templates/profile/main.html:35 msgid "Figures" msgstr "Figuras" -#: templates/_layout.html:39 templates/_layout.html.py:51 -#: templates/_layout.html:106 templates/_layout.html.py:115 +#: templates/_layout.html:39 templates/_layout.html.py:50 +#: templates/_layout.html:107 templates/_layout.html.py:116 msgid "All" msgstr "Todas" -#: templates/_layout.html:48 templates/_layout.html.py:113 +#: templates/_layout.html:47 templates/_layout.html.py:114 +#: templates/profile/main.html:36 msgid "Cards" msgstr "Tarjetas" -#: templates/_layout.html:63 templates/_layout.html.py:90 +#: templates/_layout.html:62 templates/_layout.html.py:90 +msgid "My public profile" +msgstr "Mi perfil público" + +#: templates/_layout.html:63 templates/_layout.html.py:91 #: templates/account/password_reset_from_key.html:49 msgid "Change password" msgstr "Cambiar contraseña" -#: templates/_layout.html:64 templates/_layout.html.py:91 +#: templates/_layout.html:64 templates/_layout.html.py:92 msgid "Emails" msgstr "Emails" -#: templates/_layout.html:66 templates/_layout.html.py:92 +#: templates/_layout.html:66 templates/_layout.html.py:93 msgid "Log out" msgstr "Cerrar sesión" -#: templates/_layout.html:70 templates/_layout.html.py:98 -#: templates/home/home.html:66 +#: templates/_layout.html:70 templates/_layout.html.py:99 +#: templates/home/home.html:74 msgid "Login" msgstr "Iniciar sesión" -#: templates/_layout.html:71 templates/_layout.html.py:99 -#: templates/home/home.html:64 +#: templates/_layout.html:71 templates/_layout.html.py:100 +#: templates/home/home.html:72 msgid "Register" msgstr "Registrarse" -#: templates/_layout.html:143 +#: templates/_layout.html:144 msgid "Select desired currency" msgstr "Seleccionar moneda" -#: templates/_layout.html:148 +#: templates/_layout.html:149 msgid "No convert" msgstr "Sin conversión" -#: templates/_layout.html:152 +#: templates/_layout.html:153 msgid "Language" msgstr "Idioma" @@ -632,7 +646,7 @@ msgid "I want this" msgstr "Lo quiero" #: templates/amiibo/amiibo-figure.html:56 -#: templates/amiibo/amiibo-figure.html:66 templates/home/home.html:65 +#: templates/amiibo/amiibo-figure.html:66 templates/home/home.html:73 msgid "or" msgstr "o" @@ -753,10 +767,24 @@ msgstr "" "precios, e iremos añadiendo más y más." #: templates/home/home.html:53 +msgid "Public profiles" +msgstr "Perfiles públicos" + +#: templates/home/home.html:54 +msgid "" +"You will get a unique URL where you have all you collected, wanted and " +"traded amiibo. For free! This way you will never forget what you have " +"available." +msgstr "" +"Dispondrás de una dirección web única para ti donde estarán visibles los " +"amiibo que quieres, tienes e intercambias. ¡Gratis! De esta manera nunca " +"olvidaras lo que tienes." + +#: templates/home/home.html:61 msgid "EUR, GBP, JPY, USD..." msgstr "EUR, GBP, JPY, USD..." -#: templates/home/home.html:54 +#: templates/home/home.html:62 msgid "" "Because not everyone can do math to convert from currencies on the fly, you " "can select your desired currency to get an approximate conversion in real " @@ -766,11 +794,11 @@ msgstr "" "monedas extranjeras puedes seleccionar tu preferida para ver todos los " "precios con ella, ¡así de fácil!" -#: templates/home/home.html:58 +#: templates/home/home.html:66 msgid "And the most important reason of all?" msgstr "¿Y cual es la razón más importante de todas?" -#: templates/home/home.html:60 +#: templates/home/home.html:68 msgid "" "We are collectors too! We like amiibo and we do this for fun on our spare " "time." @@ -778,11 +806,11 @@ msgstr "" "¡Nosotros también somos coleccionistas! Nos gustan los amiibo y hacemos esto " "por diversión en nuestro tiempo libre." -#: templates/home/home.html:61 +#: templates/home/home.html:69 msgid "We'd like to continue with this journey, and you to be helping us." msgstr "Nos gustaría seguir con ello, ¡y que tu te apuntes!" -#: templates/home/home.html:69 +#: templates/home/home.html:77 msgid "" "And remember that we all make this better. You want your favourite shop " "added? We're missing some HUGE feature you'd like to see? Just want to get " @@ -792,6 +820,35 @@ msgstr "" "favorita añadida? ¿Nos falta algo muy importante que te hará la vida mas " "fácil? ¿Solo quieres hablar un rato? ¡Contacta con nosotros!" +#: templates/profile/main.html:11 +#, python-format +msgid "Here you can browse over %(username)s's collection" +msgstr "Aquí puedes ver la colección de %(username)s" + +#: templates/profile/main.html:19 +msgid "Want everyone to see your collection? Spread the word!" +msgstr "¿Quieres presumir de colección? ¡Difunde la palabra!" + +#: templates/profile/main.html:21 +msgid "Look at my amiibo collection!" +msgstr "¡Mira mi colección de #amiibo!" + +#: templates/profile/main.html:28 +msgid "Have it" +msgstr "Lo tiene" + +#: templates/profile/main.html:29 +msgid "Want it" +msgstr "Lo quiere" + +#: templates/profile/main.html:30 +msgid "Trade it" +msgstr "Lo cambia" + +#: templates/profile/main.html:48 +msgid "Oooops, seems this user have nothing for that." +msgstr "Ups, ¡parece que no tiene nada por aquí!" + #: templates/socialaccount/connections.html:5 #: templates/socialaccount/connections.html:10 msgid "Account Connections" diff --git a/amiibofindr/settings/base.py b/amiibofindr/settings/base.py index a2e7b0c..8709a66 100644 --- a/amiibofindr/settings/base.py +++ b/amiibofindr/settings/base.py @@ -58,6 +58,7 @@ INSTALLED_APPS = ( 'amiibofindr.apps.amiibo', 'amiibofindr.apps.shop', 'amiibofindr.apps.home', + 'amiibofindr.apps.profile', 'amiibofindr.apps.notifications', ) diff --git a/amiibofindr/static/images/home/publicprofile.es.png b/amiibofindr/static/images/home/publicprofile.es.png new file mode 100644 index 0000000000000000000000000000000000000000..3dc76c9820b5464265032a44687b7bad338bc437 GIT binary patch literal 19006 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 col.name }} {% endfor %} -