Make it possible to mark events as private #87
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
|
Loading…
Reference in New Issue