This commit is contained in:
j 2011-05-28 13:35:57 +02:00
commit 093e1b86f3
8 changed files with 81 additions and 67 deletions

View file

11
pandora/event/admin.py Normal file
View file

@ -0,0 +1,11 @@
# -*- coding: utf-8 -*-
# vi:si:et:sw=4:sts=4:ts=4
from django.contrib import admin
import models
class EventAdmin(admin.ModelAdmin):
search_fields = ['name']
admin.site.register(models.Event, EventAdmin)

15
pandora/event/managers.py Normal file
View file

@ -0,0 +1,15 @@
# -*- coding: utf-8 -*-
# vi:si:et:sw=4:sts=4:ts=4
from django.db.models import Q, Manager
class EventManager(Manager):
def get_query_set(self):
return super(EventManager, self).get_query_set()
def find(self, q=''):
qs = self.get_query_set()
qs = qs.filter(Q(name_find__icontains=q))
return qs

56
pandora/event/models.py Normal file
View file

@ -0,0 +1,56 @@
# -*- coding: utf-8 -*-
# vi:si:et:sw=4:sts=4:ts=4
from __future__ import division, with_statement
from django.db import models
from django.contrib.auth.models import User, Group
from ox.django import fields
import managers
class Event(models.Model):
'''
Events are events in time that can be once or recurring,
From Mondays to Spring to 1989 to Roman Empire
'''
created = models.DateTimeField(auto_now_add=True)
modified = models.DateTimeField(auto_now=True)
user = models.ForeignKey(User, null=True, related_name='events')
name = models.CharField(null=True, max_length=255, unique=True)
name_sort = models.CharField(null=True, max_length=255, unique=True)
name_find = models.TextField(default='', editable=True)
wikipediaId = models.CharField(max_length=1000, blank=True)
alternativeNames = fields.TupleField(default=[])
objects = managers.EventManager()
class Meta:
ordering = ('name_sort', )
#start yyyy-mm-dd|mm-dd|dow 00:00|00:00
#end yyyy-mm-dd|mm-dd|dow 00:00|00:01
start = models.CharField(default='', max_length=255)
end = models.CharField(default='', max_length=255)
startTime = models.BigIntegerField(default=0)
endTime = models.BigIntegerField(default=0)
type = models.CharField(default='', max_length=255)
def save(self, *args, **kwargs):
if not self.name_sort:
self.name_sort = self.name
self.name_find = self.name + '||'.join(self.alternativeNames)
super(Event, self).save(*args, **kwargs)
def json(self):
return {
'name': self.name,
'alternativeNames': self.alternativeNames,
'start': self.start,
'end': self.end,
'type': self.type
}

24
pandora/event/tests.py Normal file
View file

@ -0,0 +1,24 @@
"""
This file demonstrates two different styles of tests (one doctest and one
unittest). These will both pass when you run "manage.py test".
Replace these with more appropriate tests for your application.
"""
from django.test import TestCase
class SimpleTest(TestCase):
def test_basic_addition(self):
"""
Tests that 1 + 1 always equals 2.
"""
self.failUnlessEqual(1 + 1, 2)
__test__ = {"doctest": """
Another way to test that 1 + 1 is equal to 2.
>>> 1 + 1 == 2
True
"""}

103
pandora/event/views.py Normal file
View file

@ -0,0 +1,103 @@
# -*- coding: utf-8 -*-
# vi:si:et:sw=4:sts=4:ts=4
from __future__ import division
from ox.utils import json
from ox.django.decorators import login_required_json
from ox.django.shortcuts import render_to_json_response, get_object_or_404_json, json_response
import models
from api.actions import actions
@login_required_json
def addEvent(request):
data = json.loads(request.POST['data'])
if models.Event.filter(name=data['name']).count() == 0:
place = models.Event(name = data['name'])
place.save()
response = json_response(status=200, text='created')
else:
response = json_response(status=403, text='place name exists')
return render_to_json_response(response)
actions.register(addEvent, cache=False)
@login_required_json
def editEvent(request):
'''
param data
{
'id': dateid,
'date': dict
}
date contains key/value pairs with place propterties
'''
data = json.loads(request.POST['data'])
Event = get_object_or_404_json(models.Event, pk=data['id'])
if Event.editable(request.user):
conflict = False
names = [data['date']['name']] + data['date']['aliases']
for name in names: #FIXME: also check aliases!
if models.Event.filter(name=data['name']).exclude(id=Event.id).count() != 0:
conflict = True
if not conflict:
for key in data['date']:
setattr(Event, key, data['date'][key])
Event.save()
response = json_response(status=200, text='updated')
else:
response = json_response(status=403, text='Event name/alias conflict')
else:
response = json_response(status=403, text='permission denied')
return render_to_json_response(response)
actions.register(editEvent, cache=False)
@login_required_json
def removeEvent(request):
response = json_response(status=501, text='not implemented')
return render_to_json_response(response)
actions.register(removeEvent, cache=False)
def findEvent(request):
'''
param data
{'query': query, 'sort': array, 'range': array}
query: query object, more on query syntax at
https://wiki.0x2620.org/wiki/pandora/QuerySyntax
sort: array of key, operator dics
[
{
key: "year",
operator: "-"
},
{
key: "director",
operator: ""
}
]
range: result range, array [from, to]
with keys, items is list of dicts with requested properties:
return {'status': {'code': int, 'text': string},
'data': {items: array}}
Positions
param data
{'query': query, 'ids': []}
query: query object, more on query syntax at
https://wiki.0x2620.org/wiki/pandora/QuerySyntax
ids: ids of events for which positions are required
'''
data = json.loads(request.POST['data'])
response = json_response(status=200, text='ok')
response['data']['events'] = []
#FIXME: add coordinates to limit search
for p in models.Event.objects.find(data['query']):
response['data']['events'].append(p.json())
return render_to_json_response(response)
actions.register(findEvent)