Skip to content

Commit

Permalink
añadido codigo de colores en el filtrado(voy,interesado,no interesado…
Browse files Browse the repository at this point in the history
…,nada) , fotos en el filtrado, fecha en los eventos, intentando adaptar algun widget compatible
  • Loading branch information
RafaelGB committed Apr 5, 2018
1 parent 82dd26d commit 32f775a
Show file tree
Hide file tree
Showing 15 changed files with 655 additions and 23 deletions.
4 changes: 2 additions & 2 deletions accounts/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
from django.utils.decorators import method_decorator
from django.views.generic import UpdateView
from django.http import HttpResponseRedirect
from django_gravatar.helpers import get_gravatar_url, has_gravatar, get_gravatar_profile_url, calculate_gravatar_hash
from django_gravatar.helpers import get_gravatar_url

from .forms import SignUpForm, CustomAuthenticationForm, UserForm
from .models import User
Expand Down Expand Up @@ -99,7 +99,7 @@ def get(self, request, *args, **kwargs):
self.object = self.get_object()
context = super(UserUpdateView, self).get_context_data(**kwargs)
#sacamos la url de la foto de perfil del correo
url = get_gravatar_url(self.request.user.email, size=180)
url = get_gravatar_url(self.object.email, size=180)
context["photo_user"] = url

return self.render_to_response(context=context)
Expand Down
207 changes: 207 additions & 0 deletions events/custom_widgets.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,207 @@
import re
from datetime import datetime

from django import forms
from django.conf import settings
from django.forms.widgets import Widget, Select, MultiWidget, DateInput, TimeInput
from django.template.loader import render_to_string
from django.utils.safestring import mark_safe

# Attempt to match many time formats:
# Example: "12:34:56 P.M." matches:
# ('12', '34', ':56', '56', 'P.M.', 'P', '.', 'M', '.')
# ('12', '34', ':56', '56', 'P.M.')
# Note that the colon ":" before seconds is optional, but only if seconds are omitted
time_pattern = r'(\d\d?):(\d\d)(:(\d\d))? *((a{1}|A{1}|p{1}|P{1})(\.)?(m{1}|M{1})(\.)?)?$'

RE_TIME = re.compile(time_pattern)
# The following are just more readable ways to access re.matched groups:
HOURS = 0
MINUTES = 1
SECONDS = 3
MERIDIEM = 4

class SelectTimeWidget(Widget):
"""
A Widget that splits time input into <select> elements.
Allows form to show as 24hr: <hour>:<minute>,
or as 12hr: <hour>:<minute> <am|pm>
Also allows user-defined increments for minutes/seconds
"""
hour_field = '%s_hour'
minute_field = '%s_minute'
second_field = '%s_second'
meridiem_field = '%s_meridiem'
twelve_hr = False # Default to 24hr.

def __init__(self, attrs=None, hour_step=None, minute_step=None, second_step=None, twelve_hr=False):
'''
hour_step, minute_step, second_step are optional step values for
for the range of values for the associated select element
twelve_hr: If True, forces the output to be in 12-hr format (rather than 24-hr)
'''
self.attrs = attrs or {}

if twelve_hr:
self.twelve_hr = True # Do 12hr (rather than 24hr)

if hour_step and twelve_hr:
self.hours = range(1, 13, hour_step)
elif hour_step: # 24hr, with stepping.
self.hours = range(0, 24, hour_step)
elif twelve_hr: # 12hr, no stepping
self.hours = range(1, 13)
else: # 24hr, no stepping
self.hours = range(0, 24)

if minute_step:
self.minutes = range(0, 60, minute_step)
else:
self.minutes = range(0, 60)

if second_step:
self.seconds = range(0, 60, second_step)
else:
self.seconds = range(0, 60)

def render(self, name, value, attrs=None):
try: # try to get time values from a datetime.time object (value)
hour_val, minute_val, second_val = value.hour, value.minute, value.second
if self.twelve_hr:
if hour_val >= 12:
meridiem_val = 'p.m.'
else:
meridiem_val = 'a.m.'
else:
meridiem_val = None
except AttributeError:
hour_val = minute_val = second_val = meridiem_val = ''
if isinstance(value, str):
match = RE_TIME.match(value)
if match:
time_groups = match.groups();
hour_val = int(time_groups[HOURS]) % 24 # force to range(0-24)
minute_val = int(time_groups[MINUTES])

if time_groups[SECONDS] is None:
second_val = 0
else:
second_val = int(time_groups[SECONDS])

# check to see if meridiem was passed in
if time_groups[MERIDIEM] is not None:
meridiem_val = time_groups[MERIDIEM]
else: # otherwise, set the meridiem based on the time
if self.twelve_hr:
if hour_val >= 12:
meridiem_val = 'p.m.'
else:
meridiem_val = 'a.m.'
else:
meridiem_val = None

if self.twelve_hr:
# Modify the hour value appopriately for 12-hour clocks.
if hour_val > 12 and hour_val < 24:
hour_val = hour_val % 12
elif hour_val == 0:
hour_val = 12

output = []
if 'id' in self.attrs:
id_ = self.attrs['id']
else:
id_ = 'id_%s' % name

# NOTE: for times to get displayed correctly, the values MUST be converted to unicode
# When Select builds a list of options, it checks against Unicode values
if hour_val != '':
hour_val = u"%.2d" % hour_val
if minute_val != '':
minute_val = u"%.2d" % minute_val
if second_val != '':
second_val = u"%.2d" % second_val

hour_choices = [("%.2d" % i, "%.2d" % i) for i in self.hours]
hour_choices[0:0] = [('', '--')]
local_attrs = self.build_attrs(id=self.hour_field % id_)
select_html = Select(choices=hour_choices).render(self.hour_field % name, hour_val, local_attrs)
output.append(select_html)

minute_choices = [("%.2d" % i, "%.2d" % i) for i in self.minutes]
minute_choices[0:0] = [('', '--')]
local_attrs['id'] = self.minute_field % id_
select_html = Select(choices=minute_choices).render(self.minute_field % name, minute_val, local_attrs)
output.append(select_html)

second_choices = [("%.2d" % i, "%.2d" % i) for i in self.seconds]
second_choices[0:0] = [('', '--')]
local_attrs['id'] = self.second_field % id_
select_html = Select(choices=second_choices).render(self.second_field % name, second_val, local_attrs)
output.append(select_html)

if self.twelve_hr:
# If we were given an initial value, make sure the correct meridiem get's selected.
if meridiem_val and meridiem_val.startswith('p'):
meridiem_choices = [('p.m.', 'p.m.'), ('a.m.', 'a.m.'), ('', '--')]
else:
meridiem_choices = [('', '--'), ('a.m.', 'a.m.'), ('p.m.', 'p.m.')]

local_attrs['id'] = local_attrs['id'] = self.meridiem_field % id_
select_html = Select(choices=meridiem_choices).render(self.meridiem_field % name, meridiem_val, local_attrs)
output.append(select_html)

selects_html = u'\n'.join(output)

return mark_safe('<div class="friendly_time_widget">%s</div>') % (selects_html)

def id_for_label(self, id_):
return '%s_hour' % id_
id_for_label = classmethod(id_for_label)

def value_from_datadict(self, data, files, name):
meridiem = data.get(self.meridiem_field % name)
h = data.get(self.hour_field % name, 0) # hour
m = data.get(self.minute_field % name, 0) # minute
s = data.get(self.second_field % name, 0) # second

if any(falsy in (h, m) for falsy in ('', None)):
return None

#NOTE: if meridiem IS None, assume 24-hr
if meridiem is not None:
if meridiem.lower().startswith('p') and int(h) != 12:
h = (int(h) + 12) % 24
elif meridiem.lower().startswith('a') and int(h) == 12:
h = 0

if (int(h) == 0 or h) and m and s:
return '%s:%s:%s' % (h, m, s)

return data.get(name, None)

#This is the widget that splits the date and time.
class FriendlySplitDateTimeWidget(MultiWidget):
"""
A Widget that splits datetime input into two <input type="text"> boxes
and uses a better time selector
"""
date_format = DateInput
time_format = TimeInput

def __init__(self, attrs=None, date_format=None, time_format=None, twelve_hr=True):
if date_format:
self.date_format = date_format
if time_format:
self.time_format = time_format
widgets = (DateInput(attrs=attrs, format=self.date_format),
SelectTimeWidget(twelve_hr=twelve_hr))
super(FriendlySplitDateTimeWidget, self).__init__(widgets, attrs)

def decompress(self, value):
if value:
if isinstance(value, str):
value = datetime.strptime(value, '%Y-%m-%d %H:%M:%S')
return [value.date(), value.time().replace(microsecond=0)]
return [None, None]
11 changes: 5 additions & 6 deletions events/forms.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,8 @@
from django import forms
from django.utils.translation import ugettext_lazy as _
from django.forms.formsets import BaseFormSet
from .models import Event, Tag, Category, Photo, Geolocation

from mapwidgets.widgets import GooglePointFieldWidget, GoogleStaticMapWidget, GoogleStaticOverlayMapWidget


from .models import Event, Tag, Category, Photo, Geolocation
class GeolocationForm(forms.ModelForm):

class Meta:
Expand All @@ -28,26 +25,28 @@ class EventForm(forms.ModelForm):
help_text='maximos caracteres permitidos: 5000.'
)


class Meta:
model = Event

fields = [
'title',
'description',
'summary',
'date',
'description',
'budget',
'duration'
]
#Cambia el nombre del campo por el que se desea mostrar en html
labels = {
'date': _('Fecha'),
'title': _('Título'),
'summary': _('Resumen'),
'budget': _('Precio aproximado'),
'duration': _('Duración aproximada')
}

widgets = {

}
class BasePhotoFormSet(BaseFormSet):
def clean(self):
Expand Down
21 changes: 21 additions & 0 deletions events/migrations/0002_event_date.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.6 on 2018-04-05 20:12
from __future__ import unicode_literals

import datetime
from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('events', '0001_initial'),
]

operations = [
migrations.AddField(
model_name='event',
name='date',
field=models.DateTimeField(blank=True, default=datetime.datetime.now),
),
]
4 changes: 3 additions & 1 deletion events/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
from accounts.models import User
from decimal import Decimal
from django.core.validators import MinValueValidator
from datetime import datetime
from django.template.defaultfilters import slugify
from django.utils.html import mark_safe
from markdown import markdown
Expand Down Expand Up @@ -60,10 +61,11 @@ class Event(models.Model):
"""
views = models.PositiveIntegerField(default=0)
"""
Detalles
Fechas
---------------------------------------------------------
"""
date = models.DateTimeField(default=datetime.now, blank=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(null=True)
"""
Expand Down
9 changes: 5 additions & 4 deletions events/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -405,10 +405,11 @@ def NewEvent(request):
newCategory = Category.objects.get(name_category=category)
newCategory.events_categories.add(event.pk)
return redirect('eventDetails', pk=event.pk)

form = EventForm()
formGeo = GeolocationForm()
formset = PhotoFormSet(queryset=Photo.objects.none())
else:
form = EventForm()
formGeo = GeolocationForm()
formset = PhotoFormSet(queryset=Photo.objects.none())

#obtencion de tags y darles formato para funcion de autocompletado
autoTags = list(Tag.objects.values('name_tag'))
autoTags = str(autoTags).replace("'name_tag'","name_tag")
Expand Down
Binary file added media/Events/3/hqdefault.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading

0 comments on commit 32f775a

Please sign in to comment.