save UI state

This commit is contained in:
rlx 2011-01-15 14:22:29 +00:00
commit c8aa818fed
7 changed files with 259 additions and 169 deletions

View file

@ -29,4 +29,7 @@ def site_config():
site_config['keys'] = {}
for key in site_config['sortKeys']:
site_config['keys'][key['id']] = key
site_config['_findKeys'] = {}
for key in site_config['findKeys']:
site_config['_findKeys'][key['id']] = key
return site_config

View file

@ -343,7 +343,7 @@ class Item(models.Model):
def save(key, value):
f, created = ItemFind.objects.get_or_create(item=self, key=key)
if value not in ('', '||'):
f.value = value
f.value = value.strip()
f.save()
else:
f.delete()
@ -785,6 +785,8 @@ class ItemFind(models.Model):
key = models.CharField(max_length=200, db_index=True)
value = models.TextField(blank=True)
def __unicode__(self):
return u"%s=%s" % (self.key, self.value)
'''
ItemSort
table constructed based on info in site_config['sortKeys']

View file

@ -239,8 +239,13 @@ def autocomplete(request):
op = data.get('operator', '')
site_config = models.site_config()
order_by = site_config['_findKeys'].get(data['key'], {}).get('autocompleteSortKey', False)
if order_by:
order_by = '-sort__%s_desc' % order_by
else:
order_by = '-items'
if site_config['keys'][data['key']]['type'] == 'title':
qs = models.Item.objects.filter(available=True) #does this need more limiting? user etc
qs = _parse_query({'query': data.get('query', {})}, request.user)['qs']
if data['value']:
if op == '':
qs = qs.filter(find__key=data['key'], find__value__icontains=data['value'])
@ -248,7 +253,7 @@ def autocomplete(request):
qs = qs.filter(find__key=data['key'], find__value__istartswith=data['value'])
elif op == '$':
qs = qs.filter(find__key=data['key'], find__value__iendswith=data['value'])
qs = qs.order_by('-sort__%s'%site_config['keys'][data['key']]['autocompleteSortKey'])
qs = qs.order_by(order_by)
qs = qs[data['range'][0]:data['range'][1]]
response = json_response({})
response['data']['items'] = [i.get(data['key']) for i in qs]
@ -261,7 +266,8 @@ def autocomplete(request):
qs = qs.filter(value__istartswith=data['value'])
elif op == '$':
qs = qs.filter(value__iendswith=data['value'])
qs = qs.values('value').annotate(items=Count('id')).order_by('-items')
qs = qs.values('value').annotate(items=Count('id'))
qs = qs.order_by(order_by)
qs = qs[data['range'][0]:data['range'][1]]
response = json_response({})
response['data']['items'] = [i['value'] for i in qs]

View file

@ -1,7 +1,7 @@
{
"findKeys": [
{"id": "all", "title": "All"},
{"id": "title", "title": "Title", "autocomplete": true},
{"id": "title", "title": "Title", "autocomplete": true, "autocompleteSortKey": "votes"},
{"id": "director", "title": "Director", "autocomplete": true},
{"id": "country", "title": "Country", "autocomplete": true},
{"id": "year", "title": "Year", "autocomplete": true},
@ -73,7 +73,7 @@
{"id": "featured", "title": "Featured Lists"}
],
"sortKeys": [
{"id": "title", "title": "Title", "width": 180, "removable": false, "type": "title", "autocompleteSortKey": "votes"},
{"id": "title", "title": "Title", "width": 180, "removable": false, "type": "title"},
{"id": "director", "title": "Director", "width": 180, "removable": false, "type": "person"},
{"id": "country", "title": "Country", "width": 120, "type": "string"},
{"id": "year", "title": "Year", "width": 60, "type": "year"},

View file

@ -33,7 +33,17 @@ class UserProfile(models.Model):
ui = {}
config = site_config()
ui.update(config['user']['ui'])
ui.update(self.ui)
def updateUI(ui, new):
'''
only update set keys in dicts
'''
for key in new:
if isinstance(new[key], dict) and key in ui:
ui[key] = updateUI(ui[key], new[key])
else:
ui[key] = new[key]
return ui
ui = updateUI(ui, self.ui)
if not 'lists' in ui:
ui['lists'] = {}
ui['lists'][''] = config['uiDefaults']['list']

View file

@ -409,14 +409,14 @@ def setUI(request):
key.subkey: value
}
you can set nested keys
api.setUI({"lists.my.listView": "icons"})
api.setUI({"lists|my|ListView": "icons"})
return {
'status': {'code': int, 'text': string}
}
'''
data = json.loads(request.POST['data'])
keys = data.keys()[0].split('.')
keys = data.keys()[0].split('|')
value = data.values()[0]
profile = request.user.get_profile()
p = profile.ui
@ -425,6 +425,8 @@ def setUI(request):
if isinstance(p, list):
p = p[getPositionById(p, key)]
else:
if key not in p:
p[key] = {}
p = p[key]
p[keys[0]] = value
profile.save()