pandora/pandora/news/views.py

120 lines
3.4 KiB
Python

# -*- coding: utf-8 -*-
import ox
from ox.utils import json
from oxdjango.decorators import login_required_json
from oxdjango.shortcuts import render_to_json_response, get_object_or_404_json, json_response
from oxdjango.api import actions
from changelog.models import add_changelog
from . import models
def getNews(request, data):
'''
Gets one or all news items
takes {
id: string // news item id (optional)
}
returns { // if `id` is present
id: string, // news item id
key: value, // property id and value
... // more key/value pairs
} or { // if `id` is missing
items: [
{
id: string, // news item id
key: value, // property id and value
... // more key/value pairs
},
... // more news items
]
}
see: addNews, editNews, removeNews
'''
response = json_response()
if 'id' in data:
news = get_object_or_404_json(models.News, id=ox.fromAZ(data['id']))
response['data'] = news.json()
else:
qs = models.News.objects.all().order_by('-date')
response['data']['items'] = [p.json() for p in qs]
return render_to_json_response(response)
actions.register(getNews)
@login_required_json
def addNews(request, data):
'''
Adds a new news item
takes {
date: string, // date (format undocumented)
text: text, // text
title: string // title
}
returns {
id: string, // news item id
... // more key/value pairs
}
see: editNews, getNews, removeNews
'''
news = models.News()
for key in ('title', 'text', 'date'):
if key in data:
setattr(news, key, data[key])
news.save()
response = json_response(news.json())
add_changelog(request, data, news.get_id())
return render_to_json_response(response)
actions.register(addNews, cache=False)
@login_required_json
def removeNews(request, data):
'''
Removes a news item
takes {
id: string // news item id
}
returns {}
see: addNews, editNews, getNews
'''
response = json_response({})
news = get_object_or_404_json(models.News, id=ox.fromAZ(data['id']))
if news.editable(request.user):
add_changelog(request, data)
news.delete()
response = json_response(status=200, text='news removed')
else:
response = json_response(status=403, text='permission denied')
return render_to_json_response(response)
actions.register(removeNews, cache=False)
@login_required_json
def editNews(request, data):
'''
Edits a news item
takes {
date: string, // date (format undocumented)
id: string, // news item id
text: string, // text
title: string // title
}
returns {
id: string // news item id
... // more properties
}
see: addNews, getNews, removeNews
'''
response = json_response({})
n = get_object_or_404_json(models.News, id=ox.fromAZ(data['id']))
if n.editable(request.user):
for key in ('title', 'text', 'date'):
if key in data:
setattr(n, key, data[key])
n.save()
response['data'] = n.json()
add_changelog(request, data)
else:
response = json_response(status=403, text='permission denied')
return render_to_json_response(response)
actions.register(editNews, cache=False)