buttons, testing, etc

This commit is contained in:
sanj 2011-01-04 11:57:10 +05:30
parent 7dcb0a3eaa
commit dc42c90e2d
8 changed files with 426 additions and 35 deletions

View File

@ -93,6 +93,21 @@ def api_error(request):
success = error_is_success success = error_is_success
return render_to_json_response({}) return render_to_json_response({})
def api_find(request):
data = json.loads(request.POST['data'])
print json.dumps(data)
module = __import__(data['module'])
model = module.models.__getattribute__(data['model'])
response = json_response({})
l = model.get_list(data)
if data.has_key('range'):
response['data']['items'] = l
else:
response['data']['items'] = len(l)
response['status'] = {'code': 200}
return render_to_json_response(response)
def get_api_doc(f): def get_api_doc(f):
f = 'api_' + f f = 'api_' + f

View File

@ -1,3 +1,109 @@
from django.db import models from django.db import models
import operator
from django.db.models import Q
from ox.text import smartSplit
from django.core.paginator import Paginator, InvalidPage, EmptyPage
def splitSearch(string):
ret = []
for s in smartSplit(string):
word = s.replace("'", "").replace('"', '')
ret.append(word)
return ret
class ItfModel(models.Model):
fts_fields = []
fk_filters = []
sort_fields = []
class Meta:
abstract = True
def list_dict(self):
return {}
def info_dict(self):
return {}
@classmethod
def fts(kls, qset, search):
terms = splitSearch(search)
qobjects = []
for t in terms:
for f in kls.fts_fields:
qstring = f + '__icontains'
qobject = Q(**{qstring:t})
qobjects.append(qobject)
return qset.filter(reduce(operator.or_, qobjects))
'''
eg. fks = {
'somefield': [1, 5, 7],
'someotherfield': [3]
}
'''
@classmethod
def filter_by_fks(kls, qset, fks):
qobjects = []
for key in fks.keys():
field = getField(kls._meta.fields, key)
if field:
# rel_class = field.related.parent_model
for i in fks[key]:
qobject = Q(**{field.name: i})
qobjects.append(qobject)
return qset.filter(reduce(operator.or_, qobjects))
@classmethod
def get_fk_objects(kls):
ret = {}
for f in kls.fk_filters:
ret[f] = []
field = getField(kls._meta.fields, f)
rel_class = field.related.parent_model
for o in rel_class.objects.all():
ret[f].append({
'id': o.id,
'title': unicode(o)
})
return ret
@classmethod
def get_list(kls, data):
options = {
'page_no': 1,
'list_size': 8,
'search': '',
'sort': []
}
options.update(data)
ret = []
page_no = options['page_no']
list_size = options['list_size']
qset = kls.objects.all()
search = options['search']
if search != '':
qset = kls.fts(qset, search)
sort = options['sort']
if sort != []:
qset = qset.order_by(sort[0]) #FIXME: Do Sort!
paginator = Paginator(qset, list_size)
try:
results = paginator.page(page_no)
except (EmptyPage, InvalidPage):
results = paginator.page(paginator.num_pages)
for r in results.object_list:
ret.append(r.list_dict())
return ret
def getField(fields, name):
for f in fields:
if f.name == name:
return f
return False
# Create your models here.

View File

@ -1,7 +1,9 @@
from django.db import models from django.db import models
from tagging.fields import TagField from tagging.fields import TagField
from django.core.paginator import Paginator, InvalidPage, EmptyPage
from app.models import ItfModel
class BestPractice(models.Model): class BestPractice(ItfModel):
title = models.CharField(max_length=512) title = models.CharField(max_length=512)
story = models.TextField() story = models.TextField()
guideline = models.TextField(blank=True) guideline = models.TextField(blank=True)
@ -11,9 +13,33 @@ class BestPractice(models.Model):
tags = TagField(blank=True, help_text="Enter as many tags as you like, separated by commas.") tags = TagField(blank=True, help_text="Enter as many tags as you like, separated by commas.")
category = models.ForeignKey("BestPracticeCategory") category = models.ForeignKey("BestPracticeCategory")
fts_fields = ['title', 'story', 'guideline', 'law', 'theatre', 'quick_howto']
fk_filters = ['category']
sort_fields = ['title']
def __unicode__(self): def __unicode__(self):
return self.title return self.title
def info_dict(self):
return {
'title': self.title,
'story': self.story,
'guideline': self.guideline,
'law': self.law,
'theatre': self.theatre,
'quick_howto': self.quick_howto,
'category': self.category.name,
'category_id': self.category.id
}
def list_dict(self):
return {
'id': self.id,
'title': self.title,
'category': self.category.name,
}
class BestPracticeCategory(models.Model): class BestPracticeCategory(models.Model):
name = models.CharField(max_length=256) name = models.CharField(max_length=256)
description = models.TextField(blank=True) description = models.TextField(blank=True)

View File

@ -2,6 +2,7 @@ from django.db import models
import datetime import datetime
import time import time
from ckeditor.fields import RichTextField from ckeditor.fields import RichTextField
from app.models import ItfModel
class Comment(models.Model): class Comment(models.Model):
name = models.CharField(max_length=255) name = models.CharField(max_length=255)
@ -30,10 +31,11 @@ class CommentCaptcha(models.Model):
# class CommentVote(models.Model): # class CommentVote(models.Model):
class Meeting(models.Model): class Meeting(ItfModel):
title = models.CharField(max_length=255) title = models.CharField(max_length=255)
intro = models.TextField(blank=True, null=True) intro = models.TextField(blank=True, null=True)
slug = models.SlugField() slug = models.SlugField()
fts_fields = ['title', 'intro']
def __unicode__(self): def __unicode__(self):
return self.title return self.title

View File

@ -1,6 +1,8 @@
from django.db import models from django.db import models
from django.contrib.auth.models import User from django.contrib.auth.models import User
from tagging.fields import TagField from tagging.fields import TagField
from django.core.paginator import Paginator, InvalidPage, EmptyPage
from app.models import ItfModel
GENRES = ( GENRES = (
('Fiction', 'Fiction'), ('Fiction', 'Fiction'),
@ -14,7 +16,7 @@ LANGUAGE_CHOICES = (
('be', 'Bengali'), ('be', 'Bengali'),
) )
class Script(models.Model): class Script(ItfModel):
user = models.ForeignKey(User) user = models.ForeignKey(User)
title = models.CharField(max_length=255) title = models.CharField(max_length=255)
synopsis = models.TextField(blank=True) synopsis = models.TextField(blank=True)
@ -30,10 +32,45 @@ class Script(models.Model):
script = models.FileField(null=True, upload_to='upload/scripts/') script = models.FileField(null=True, upload_to='upload/scripts/')
license_adapt = models.ForeignKey("LicensePerform", help_text="License for adaptation rights") license_adapt = models.ForeignKey("LicensePerform", help_text="License for adaptation rights")
license_perform = models.ForeignKey("LicenseAdapt", help_text="License for performance rights") license_perform = models.ForeignKey("LicenseAdapt", help_text="License for performance rights")
fts_fields = ['title', 'synopsis', 'author']
fk_fields = ['license_adapt', 'license_perform']
#Meta
added = models.DateTimeField(auto_now_add=True)
modified = models.DateTimeField(auto_now=True)
def __unicode__(self): def __unicode__(self):
return self.title return self.title
'''
@classmethod
def get_list(kls, data):
options = {
'page_no': 1,
'list_size': 8
}
options.update(data)
l = []
page_no = options['page_no']
list_size = options['list_size']
qset = kls.objects.all()
paginator = Paginator(qset, list_size)
try:
results = paginator.page(page_no)
except (EmptyPage, InvalidPage):
results = paginator.page(paginator.num_pages)
for r in results.object_list:
l.append({
'id': r.id,
'title': r.title
})
return l
'''
class License(models.Model): class License(models.Model):
letter = models.CharField(max_length=2) letter = models.CharField(max_length=2)
name = models.CharField(max_length=255) name = models.CharField(max_length=255)

View File

@ -20,6 +20,8 @@ PROJECT_ROOT = PROJECT_PATH
CKEDITOR_MEDIA_PREFIX = "/static/ckeditor/" CKEDITOR_MEDIA_PREFIX = "/static/ckeditor/"
CKEDITOR_UPLOAD_PATH = join(PROJECT_PATH, "static/upload/images/") CKEDITOR_UPLOAD_PATH = join(PROJECT_PATH, "static/upload/images/")
AUTH_PROFILE_MODULE = "profiles.Person"
ADMINS = ( ADMINS = (
# ('Your Name', 'your_email@domain.com'), # ('Your Name', 'your_email@domain.com'),
) )

View File

@ -1,4 +1,4 @@
var ITF = {};
var app = new Ox.App({ var app = new Ox.App({
apiURL: '/api/', apiURL: '/api/',
@ -53,6 +53,143 @@ app.launch(function(data) {
}); });
app.Query = (function() {
function constructFind(query) {
Ox.print('cF', query)
return /*encodeURI(*/$.map(query.conditions, function(v, i) {
if (!Ox.isUndefined(v.conditions)) {
return '[' + constructFind(v) + ']';
} else {
return v.value !== '' ? v.key + (v.key ? ':' : '') + constructValue(v.value, v.operator) : null;
}
}).join(query.operator)/*)*/;
}
function constructValue(value, operator) {
operator = operator.replace('=', '^$');
if (operator.indexOf('$') > -1) {
value = operator.substr(0, operator.length - 1) + value + '$'
} else {
value = operator + value;
}
return value;
}
function mergeFind() {
}
function parseFind(str) {
var find = {
conditions: [],
operator: ''
},
subconditions = str.match(/\[.*?\]/g) || [];
$.each(subconditions, function(i, v) {
subconditions[i] = v.substr(1, v.length - 2);
str = str.replace(v, '[' + i + ']');
});
if (str.indexOf(',') > -1) {
find.operator = '&';
} else if (str.indexOf('|') > -1) {
find.operator = '|';
}
Ox.print('pF', str, find.operator)
find.conditions = $.map(find.operator === '' ? [str] : str.split(find.operator == '&' ? ',' : '|'), function(v, i) {
Ox.print('v', v)
var ret, kv;
if (v[0] == '[') {
Ox.print('recursion', subconditions)
ret = parseFind(subconditions[parseInt(v.substr(1, v.length - 2))]);
} else {
kv = ((v.indexOf(':') > - 1 ? '' : ':') + v).split(':');
ret = $.extend({
key: kv[0]
}, parseValue(kv[1]));
}
return ret;
});
return find;
}
function parseValue(str) {
var value = {
value: decodeURI(str),
operator: ''
};
if (value.value[0] == '!') {
value.operator = '!'
value.value = value.value.substr(1);
}
if ('^<>'.indexOf(value.value[0]) > -1) {
value.operator += value.value[0];
value.value = value.value.substr(1);
}
if (value.value.substr(-1) == '$') {
value.operator += '$';
value.value = value.value.substr(0, value.value.length - 1);
}
value.operator = value.operator.replace('^$', '=');
return value;
}
return {
fromString: function(str) {
var query = Ox.unserialize(str),
sort = [];
if ('find' in query) {
app.user.ui.findQuery = parseFind(query.find);
Ox.print('user.ui.findQuery', app.user.ui.findQuery)
}
if ('sort' in query) {
sort = query.sort.split(',')
app.user.ui.sort = $.map(query.sort.split(','), function(v, i) {
var hasOperator = '+-'.indexOf(v[0]) > -1,
key = hasOperator ? query.sort.substr(1) : query.sort,
operator = hasOperator ? v[0].replace('+', '') : Ox.getObjectById(app.config.sortKeys, key).operator;
return {
key: key,
operator: operator
};
});
}
if ('view' in query) {
app.user.ui.listView = query.view;
}
},
toObject: function(groupId) {
Ox.print('tO', app.user.ui.findQuery.conditions)
// the inner $.merge() creates a clone
var conditions = $.merge($.merge([], app.user.ui.listQuery.conditions), app.user.ui.findQuery.conditions);
$.merge(conditions, app.ui.groups ? $.map(app.ui.groups, function(v, i) {
if (v.id != groupId && v.query.conditions.length) {
return v.query.conditions.length == 1 ?
v.query.conditions : v.query;
}
}) : []),
operator = conditions.length < 2 ? '' : ','; // fixme: should be &
Ox.print('>>', groupId, app.user.ui.find, conditions);
return {
conditions: conditions,
operator: operator
};
},
toString: function() {
Ox.print('tS', app.user.ui.find)
return Ox.serialize({
find: constructFind(app.Query.toObject()),
sort: app.user.ui.sort[0].operator + app.user.ui.sort[0].key,
view: app.user.ui.listView
});
}
};
})();
app.construct = { app.construct = {
/* /*
@ -148,6 +285,10 @@ BEGIN headerPanel
i.bindEvent("submit", function(val) { i.bindEvent("submit", function(val) {
Ox.print("Should be doing a search"); Ox.print("Should be doing a search");
}); });
i.css({
'marginRight': '15px',
'marginTop': '6px'
});
return i; return i;
}, },
@ -215,10 +356,16 @@ BEGIN mainPanel
var id = 'cityPicker'; var id = 'cityPicker';
var i = app.$ui[id] = new Ox.Input({ var i = app.$ui[id] = new Ox.Input({
id: id, id: id,
placeholder: 'Chose Your City' placeholder: 'Chose Your City',
autocomplete: ['Mumbai', 'Gurgaon', 'Agra', 'Delhi', 'Bangalore', 'Calcutta', 'Hyderabad'],
autocompleteSelect: true,
autocompleteSelectHighlight: true,
autocompleteSelectSubmit: true,
autocompleteReplaceCorrect: true
}); });
i.submit(function(val) { i.bindEvent("submit", function(event, data) {
Ox.Print("should handle submit of city name"); Ox.print(data);
// alert(data.value);
}); });
return i; return i;
}, },
@ -303,7 +450,7 @@ BEGIN mainPanel
'newsfeedBox': function() { 'newsfeedBox': function() {
var id = 'newsfeedBox'; var id = 'newsfeedBox';
var c = app.$ui[id] = new Ox.ItfBox({ var c = app.$ui[id] = new Ox.Container({
id: id, id: id,
title: 'ITF NewsFeed' title: 'ITF NewsFeed'
}); });
@ -372,20 +519,26 @@ BEGIN mainPanel
}, },
'scriptArchiveBox': function() { 'scriptArchiveBox': function() {
var id = 'scriptArchiveBox'; var id = 'scriptbankBox';
var c = app.$ui[id] = new Ox.Container({ var c = app.$ui[id] = new Ox.ItfBox({
id: id 'id': id,
'title': 'Script Bank',
'module': 'scriptbank',
'model': 'Script'
}); });
c.$content.html("script archive goes here"); // c.$content.html("script archive goes here");
return c; return c;
}, },
'bestPracticesBox': function() { 'bestPracticesBox': function() {
var id = 'bestPracticesBox'; var id = 'bestpracticesBox';
var c = app.$ui[id] = new Ox.Container({ var c = app.$ui[id] = new Ox.ItfBox({
id: id 'id': id,
'title': 'Best Practices',
'module': 'bestpractices',
'model': 'BestPractice'
}); });
c.$content.html("best practices goes here"); // c.$content.html("best practices goes here");
return c; return c;
}, },
@ -534,33 +687,82 @@ Ox.ItfBox = function(options, self) {
var title = self.options.title; var title = self.options.title;
var $titlebar = new Ox.Bar({ var $titlebar = new Ox.Bar({
orientation: 'horizontal', orientation: 'horizontal',
size: 16 size: 18
}) })
// .dblclick(dblclickTitlebar) // .dblclick(dblclickTitlebar)
.appendTo(that), .appendTo(that);
/*
$switch = new Ox.Button({ var $title = new Ox.Element()
id: options.id + 'Switch',
style: 'symbol',
title: title,
type: 'image',
})
// .click(toggleCollapsed)
.appendTo($titlebar),
*/
$title = new Ox.Element()
.addClass('OxTitle') .addClass('OxTitle')
.html(title/*.toUpperCase()*/) .html(title/*.toUpperCase()*/)
.appendTo($titlebar); .appendTo($titlebar);
var $search = new Ox.Input({
'placeholder': 'Search',
})
.css({'width': '128px', 'marginLeft': 'auto', 'marginRight': 'auto'})
.appendTo(that)
.hide();
var $switch = new Ox.Button({
id: options.id + 'Switch',
style: 'symbol',
title: 'collapse',
type: 'image',
tooltip: 'Search'
})
.css({'position': 'absolute', 'top': '1px', 'right': '1px', 'marginLeft': '6px'})
.bindEvent("click", function() {
// alert("foo");
// $search.slideDown();
$search.is(":visible") ? $search.slideUp() : $search.slideDown();
})
.appendTo($title);
var $list = new Ox.ItfList({
'width': 256,
'itemWidth': 256,
'orientation': 'horizontal',
'request': function(data, callback) {
// var queryParams = $.extend(data, {'model': options.id, 'query': app.Query.toObject()});
var queryParams = $.extend(data, {'model': options.model, 'module': options.module, 'query': {}});
// alert(JSON.stringify(queryParams));
return app.api.find(queryParams, callback)
},
'id': options.id + 'List',
'construct': function(data) {
var $a = $('<a />').attr("href", "/" + options.module.toLowerCase() + "/" + data.id).text(data.title);
var $item = $('<div />').addClass('OxTarget').append($a);
return $item;
}
})
.appendTo(that);
// $buttons = new Ox. // $buttons = new Ox.
return that; return that;
} }
Ox.ItfList = function(options, self) {
var self = self || {};
var that = new Ox.List(options, self);
return that;
}
Ox.ItfCalendar = function(options, self) {
var self = self || {};
var that = new Ox.Element(options, self);
var $titleBar = new Ox.Bar({
'size': 'small'
}).addClass('OxTitleBar').appendTo(that);
var $title = new Ox.Element().html("Calendar").appendTo($titleBar);
return that;
}
ITF.templates = {};

View File

@ -17,7 +17,8 @@ if(typeof(console)=='undefined') {
<script type="text/javascript" src="/static/oxjs/build/js/ox.load.js"></script> <script type="text/javascript" src="/static/oxjs/build/js/ox.load.js"></script>
<script type="text/javascript" src="/static/oxjs/build/js/ox.js"></script> <script type="text/javascript" src="/static/oxjs/build/js/ox.js"></script>
<script type="text/javascript" src="/static/oxjs/build/js/ox.ui.js"></script> <script type="text/javascript" src="/static/oxjs/build/js/ox.ui.js"></script>
<script type="text/javascript" src="/static/js/itf.js"></script> <script type="text/javascript" src="/static/js/itf/itf.js"></script>
<script type="text/javascript" src="/static/js/bookmyshow.js"></script>
</head> </head>
<body></body> <body></body>
</html> </html>