v/pol
1
0
mirror of https://github.com/taroved/pol synced 2025-05-29 04:20:09 -07:00
pol/frontend/frontend/views.py
Alexandr Nesterenko f1589f3e5e add link field
2017-07-17 12:37:33 -07:00

124 lines
4.2 KiB
Python

import urllib
import json
from django.views.decorators.csrf import ensure_csrf_cookie
from django.http import HttpResponseRedirect, HttpResponse, HttpResponseBadRequest
from django.shortcuts import render
from django.core.validators import URLValidator
from django.core.exceptions import ValidationError
from django.core.urlresolvers import reverse
from .forms import IndexForm
from .settings import DOWNLOADER_PAGE_URL, FEED_PAGE_URL, FEED1_PAGE_URL
from .setup_tool import get_selection_tag_ids, build_xpathes_for_items
from .models import Feed, Field, FeedField
def index(request):
if request.method == 'GET' and 'url' in request.GET:
form = IndexForm(request.GET)
if form.is_valid():
val = URLValidator()
try:
url = request.GET['url']
if not url.startswith('http'):
url = 'http://' + url
val(url)
except ValidationError, e:
form.add_error('url', 'Invalid url')
else:
return HttpResponseRedirect('%s?url=%s' % (reverse('setup'), urllib.quote(url.encode('utf8'))))
else:
form = IndexForm()
return render(request, 'frontend/index.html', {'form': form})
def contact(request):
return render(request, 'frontend/contact.html')
@ensure_csrf_cookie
def setup(request):
if request.method == 'GET' and 'url' in request.GET:
external_page_url = DOWNLOADER_PAGE_URL + urllib.quote(request.GET['url'], safe='')
return render(request, 'frontend/setup.html',
{
'external_page_url': external_page_url,
'page_url': request.GET['url']
})
return HttpResponseBadRequest('Url is required')
def _validate_html(html):
def walk(tag):
if (len(tag) != 3 or not isinstance(tag[0], basestring) or
type(tag[1]) is not dict or 'tag-id' not in tag[1] or
type(tag[2]) is not list):
return False
for t in tag[2]:
if not walk(t):
return False
return True
return walk(html)
def setup_get_selected_ids(request):
if request.method == 'POST':
obj = json.loads(request.body)
if 'html' not in obj or 'names' not in obj:
return HttpResponseBadRequest('"html" and "names" parameters are required')
html_json = obj['html']
item_names = obj['names']
if not _validate_html(html_json):
return HttpResponseBadRequest('html is invalid')
return HttpResponse(json.dumps(get_selection_tag_ids(item_names, html_json)))
def _create_feed(url, xpathes):
feed_xpath = xpathes[0]
item_xpathes = xpathes[1]
feed = Feed(uri=url, xpath=feed_xpath)
feed.save()
fields = Field.objects.all()
for field in fields:
if field.name in item_xpathes:
ff = FeedField(feed=feed, field=field, xpath=item_xpathes[field.name])
ff.save()
if field.name == 'link' and 'title' in item_xpathes:
ff = FeedField(feed=feed, field=field, xpath='('+ item_xpathes['title'] +')[1]/ancestor-or-self::node()[name()="a"]/@href')
ff.save()
return feed.id
def setup_create_feed(request):
if request.method == 'POST':
obj = json.loads(request.body)
if 'html' not in obj or 'names' not in obj or 'url' not in obj:
return HttpResponseBadRequest('"html", "names" and "url" parameters are required')
html_json = obj['html']
item_names = obj['names']
url = obj['url']
if not _validate_html(html_json):
return HttpResponseBadRequest('html is invalid')
xpathes = build_xpathes_for_items(item_names, html_json)
feed_id = _create_feed(url, xpathes)
return HttpResponse(reverse('preview', args=(feed_id,)))
def preview(request, feed_id):
if request.method == 'GET':
return render(request, 'frontend/preview.html',
{
'feed_url': FEED_PAGE_URL + feed_id,
'feed1_url': FEED1_PAGE_URL + feed_id,
})
return HttpResponseBadRequest('Only GET method supported')