split models into apps, new api interface

This commit is contained in:
j 2010-11-26 16:07:24 +01:00
commit b8e5764f3d
32 changed files with 2033 additions and 488 deletions

0
pandora/date/__init__.py Normal file
View file

12
pandora/date/admin.py Normal file
View file

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

19
pandora/date/managers.py Normal file
View file

@ -0,0 +1,19 @@
# -*- coding: utf-8 -*-
# vi:si:et:sw=4:sts=4:ts=4
import re
from ox.utils import json
from django.contrib.auth.models import User
from django.core.exceptions import ObjectDoesNotExist
from django.db.models import Q, Manager
import models
class DateManager(Manager):
def get_query_set(self):
return super(DateManager, self).get_query_set()
def find(self, q=''):
qs = self.get_query_set()
qs = qs.filter(Q(name_find__icontains=q))
return qs

44
pandora/date/models.py Normal file
View file

@ -0,0 +1,44 @@
# -*- 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.db.models import Q
from django.conf import settings
from ox.django import fields
import managers
class Date(models.Model):
'''
Dates are dates in time that can be once or recurring,
From Mondays to Spring to 1989 to Roman Empire
'''
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)
objects = managers.DateManager()
class Meta:
ordering = ('name_sort', )
#FIXME: how to deal with aliases
aliases = fields.TupleField(default=[])
#once|year|week|day
recurring = models.IntegerField(default=0)
#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(null=True, max_length=255)
end = models.CharField(null=True, 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.aliases)
super(Date, self).save(*args, **kwargs)

23
pandora/date/tests.py Normal file
View file

@ -0,0 +1,23 @@
"""
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
"""}

113
pandora/date/views.py Normal file
View file

@ -0,0 +1,113 @@
# -*- coding: utf-8 -*-
# vi:si:et:sw=4:sts=4:ts=4
from __future__ import division
import os.path
import re
from datetime import datetime
from urllib2 import unquote
import mimetypes
from django import forms
from django.core.paginator import Paginator
from django.contrib.auth.decorators import login_required
from django.contrib.auth.models import User
from django.db.models import Q, Avg, Count, Sum
from django.http import HttpResponse, Http404
from django.shortcuts import render_to_response, get_object_or_404, get_list_or_404, redirect
from django.template import RequestContext
from django.conf import settings
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
from ox.django.http import HttpFileResponse
import ox
import models
@login_required_json
def api_addDate(request):
data = json.loads(request.POST['data'])
if models.Date.filter(name=data['name']).count() == 0:
place = models.Date(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)
@login_required_json
def api_editDate(request):
'''
param data
{
'id': dateid,
'date': dict
}
date contains key/value pairs with place propterties
'''
data = json.loads(request.POST['data'])
Date = get_object_or_404_json(models.Date, pk=data['id'])
if Date.editable(request.user):
conflict = False
names = [data['date']['name']] + data['date']['aliases']
for name in names: #FIXME: also check aliases!
if models.Date.filter(name=data['name']).exclude(id=Date.id).count() != 0:
conflict = True
if not conflict:
for key in data['date']:
setattr(Date, key, data['date'][key])
Date.save()
response = json_response(status=200, text='updated')
else:
response = json_response(status=403, text='Date name/alias conflict')
else:
response = json_response(status=403, text='permission denied')
return render_to_json_response(response)
@login_required_json
def api_removeDate(request):
response = json_response(status=501, text='not implemented')
return render_to_json_response(response)
def api_findDate(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 dates for which positions are required
'''
data = json.loads(request.POST['data'])
response = json_response(status=200, text='ok')
response['data']['places'] = []
#FIXME: add coordinates to limit search
for p in Dates.objects.find(data['query']):
response['data']['dates'].append(p.json())
return render_to_json_response(response)