Make it possible to mark events as private #87

Merged
gergely merged 1 commits from event-visibility into master 2018-07-16 10:28:21 +00:00
4 changed files with 66 additions and 2 deletions

View File

@ -199,12 +199,14 @@ class GregorianCalendar(CalendarSystem):
"""Returns all events for a given day
"""
from ..models import Event, Profile
from ..models import Event, EventVisibility, Invitation, Profile, Response
events = Event.query
if user:
events = events.join(Profile) \
events = events.outerjoin(Invitation) \
.outerjoin(Response) \
.join(Profile, Event.profile) \
.filter(Profile.user == user)
start_timestamp = date.replace(hour=0, minute=0, second=0, microsecond=0)
@ -216,4 +218,12 @@ class GregorianCalendar(CalendarSystem):
(Event.end_time < end_timestamp))) \
.order_by('start_time', 'end_time')
if user is None:
events = events.filter(Event.visibility == EventVisibility.public)
else:
events = events.filter((Event.visibility == EventVisibility.public) |
(Event.profile == user.profile) |
(Invitation.invitee == user.profile) |
(Response.profile == user.profile))
return events

View File

@ -26,6 +26,8 @@ from wtforms.ext.dateutil.fields import DateTimeField
from wtforms.validators import DataRequired, Email, StopValidation, ValidationError
from wtforms.widgets import TextArea
from calsocial.models import EventVisibility, EVENT_VISIBILITY_TRANSLATIONS
class UsernameAvailable(object): # pylint: disable=too-few-public-methods
"""Checks if a username is available
@ -169,6 +171,36 @@ class TimezoneField(SelectField):
yield (value, label, value == self.data)
class EnumField(SelectField):
def __init__(self, enum_type, translations, *args, **kwargs):
kwargs.update({'choices': [(value, None) for value in enum_type]})
self.data = None
self.enum_type = enum_type
self.translations = translations
SelectField.__init__(self, *args, **kwargs)
def process_formdata(self, valuelist):
if not valuelist:
self.data = None
return
try:
self.data = self.enum_type[valuelist[0]]
except KeyError:
raise ValueError('Unknown value')
def iter_choices(self):
for value in self.enum_type:
label = self.translations[value] if self.translations else value.name
yield (
value.name,
self.gettext(self.translations[value]),
value == self.data
)
class EventForm(FlaskForm):
"""Form for event creation/editing
"""
@ -179,6 +211,7 @@ class EventForm(FlaskForm):
end_time = DateTimeField(_('End time'), validators=[DataRequired()])
all_day = BooleanField(_('All day'))
description = StringField(_('Description'), widget=TextArea())
visibility = EnumField(EventVisibility, EVENT_VISIBILITY_TRANSLATIONS, label=_('Visibility'))
def populate_obj(self, obj):
"""Populate ``obj`` with event data

View File

@ -103,6 +103,23 @@ class ResponseType(Enum):
return Enum.__eq__(self, other)
class EventVisibility(Enum):
"""Enumeration for event visibility
"""
#: The event is private, only attendees and people invited can see the details
private = 0
#: The event is public, anyone can see the details
public = 5
EVENT_VISIBILITY_TRANSLATIONS = {
EventVisibility.private: _('Visible only to attendees'),
EventVisibility.public: _('Visible to everyone'),
}
class SettingsProxy:
"""Proxy object to get settings for a user
"""
@ -399,6 +416,9 @@ class Event(db.Model):
#: The description of the event
description = db.Column(db.UnicodeText())
#: The visibility of the event
visibility = db.Column(db.Enum(EventVisibility), nullable=False)
def __as_tz(self, timestamp, as_timezone=None):
from pytz import timezone, utc

View File

@ -19,6 +19,7 @@
{{ field(form.end_time) }}
{{ field(form.all_day) }}
{{ field(form.description) }}
{{ field(form.visibility) }}
<button type="submit" class="ui primary button">{% trans %}Save{% endtrans %}</button>
<a href="{{ url_for('hello') }}" class="ui button">Cancel</a>