v/pol
1
0
mirror of https://github.com/taroved/pol synced 2025-05-17 23:00:10 -07:00

create feed is ready

This commit is contained in:
Alexandr Nesterenko 2016-07-09 16:20:01 -07:00
parent f29c14699e
commit 54e6dd0462
5 changed files with 154 additions and 11 deletions

View File

@ -98,7 +98,7 @@ def get_selection_tag_ids(item_tag_ids, html_json):
for name in item_tag_ids:
tag_id = item_tag_ids[name]
parent_stacks[name] = _build_parent_stack(html_json, tag_id)
#import pdb; pdb.set_trace()
# get fork
fork_stack = _get_fork_stack(parent_stacks)
@ -128,3 +128,32 @@ def get_selection_tag_ids(item_tag_ids, html_json):
selection_ids[name].append(ids[name])
return selection_ids
def _path_stack_to_xpath(stack):
stack
def build_xpathes_for_items(item_tag_ids, html_json):
parent_stacks = {}
# buld parent stacks for every item name
for name in item_tag_ids:
tag_id = item_tag_ids[name]
parent_stacks[name] = _build_parent_stack(html_json, tag_id)
# get fork
fork_stack = _get_fork_stack(parent_stacks)
# get fork path
fork_path = [tag[I_TAGNAME] for tag in fork_stack]
# get pathes for items
fork_len = len(fork_path) - 1
selection_pathes = {name:_build_path(parent_stacks[name][fork_len:]) for name in parent_stacks}
# build xpathes
feed_xpath = '/' + '/'.join(fork_path)
item_xpathes = {}
for name in selection_pathes:
item_xpathes[name] = '/'.join([repr(path_item) for path_item in selection_pathes[name]])
return [feed_xpath, item_xpathes]

View File

@ -168,6 +168,7 @@ function Item(name, button) {
$(button).css('color', 'white');
break;
}
updateCreateButton();
}
/**
@ -289,11 +290,7 @@ function buildJsonFromHtml(doc) {
return iframeHtmlJson;
}
function requestSelection() {
var htmlJson = buildJsonFromHtml($('iframe').contents());
// gather selected tag-ids
var name_ids = {};
function gatherSelectedTagIds(name_ids) {
var selected_any = false;
for (var name in items) {
if ([STATE_SELECTING, STATE_SELECTED].indexOf(items[name].state) != -1) {
@ -301,6 +298,15 @@ function requestSelection() {
selected_any = true;
}
}
return selected_any;
}
function requestSelection() {
var htmlJson = buildJsonFromHtml($('iframe').contents());
// gather selected tag-ids
var name_ids = {};
selected_any = gatherSelectedTagIds(name_ids);
if (selected_any)
return new Promise(function(resolve, reject){
@ -353,6 +359,7 @@ function onIframeElementHover(event) {
}
else { // mouseleave
// clear all hover styles
// if mouseleave calls after mouseenter we may have a problem
styleTool.unstyleAll('hover');
}
}
@ -388,11 +395,79 @@ function onItemButtonClick(event) {
curItemData = null;
}
}
////
// ++++ Create button logic
////
function updateCreateButton() {
var active = false;
for (var name in items)
if (items[name].state == STATE_SELECTED) {
active = true;
break;
}
if (active)
$('#create').removeClass('disabled');
else
$('#create').addClass('disabled');
}
function onCreateButtonClick() {
var active = !$('#create').hasClass('disabled');
if (active)
//todo: freeze UI
createFeed().then(function(feed_page_url){
alert(feed_page_url);
//window.location.href = feed_page_url;
}, function(error){
//todo: unfreez UI
console.log('Server error: '+ error);
});
}
function createFeed() {
var htmlJson = buildJsonFromHtml($('iframe').contents());
// gather selected tag-ids
var name_ids = {};
selected_any = gatherSelectedTagIds(name_ids);
if (selected_any)
return new Promise(function(resolve, reject){
$.ajax({
type: 'POST',
url: "/setup_create_feed",
data: JSON.stringify({ html: htmlJson, names: name_ids, url:$('#create').data('page-url') }),
contentType: "application/json; charset=utf-8",
dataType: "json",
headers: {"X-CSRFToken": getCookie('csrftoken')},
success: function(data){
resolve(data)
},
failure: function(errMsg) {
reject(errMsg);
}
});
console.log(JSON.stringify(htmlJson));
});
else {
return new Promise(function(resolve, reject){
setTimeout(function(){ resolve({}); }, 0);
});
}
}
////
// ++++ Create button logic
////
$(document).ready(function(){
items['title'] = new Item('title', $('#st-title')[0]);
items['description'] = new Item('description', $('#st-description')[0]);
$('#create').click(onCreateButtonClick);
$('iframe').load(function(){
// init id2el
$('iframe').contents().find('*[tag-id]').each(function(){
@ -401,7 +476,6 @@ $(document).ready(function(){
// attach iframe elements event handlers
$('iframe').contents().on('click', '*[tag-id]', onIframeElementClick);
$('iframe').contents().on('mouseenter mouseleave', '*[tag-id]', onIframeElementHover);
});
blinkButton($('#st-title'), 3);

View File

@ -8,7 +8,7 @@
<button id="st-title" class="btn btn-large btn-primary disabled has-tooltip" title="Click on the button and move cursor to the below document and pick item you interested in."
data-trigger="hover focus manual" data-animation="true">Title</button> and
<button id="st-description" class="btn btn-large btn-info disabled">Description</button>.
<button id="create" class="btn btn-large btn-primary" style="padding-right: 13px; float:right">Create <i class="icon-arrow-right icon-white" style="margin-top: 3px"></i></button>
<button id="create" class="btn btn-large btn-primary" style="padding-right: 13px; float:right" data-page-url="{{ page_url }}" data-feed-page-url="{{ feed_page_url }}">Create <i class="icon-arrow-right icon-white" style="margin-top: 3px"></i></button>
</h2>
</div>

View File

@ -26,3 +26,4 @@ urlpatterns = i18n_patterns(
)
urlpatterns.append(url(r'^setup_get_selected_ids$', views.setup_get_selected_ids, name='setup_get_selected_ids'))
urlpatterns.append(url(r'^setup_create_feed$', views.setup_create_feed, name='setup_create_feed'))

View File

@ -11,7 +11,8 @@ from django.core.urlresolvers import reverse
from .forms import IndexForm
from .settings import DOWNLOADER_PAGE_URL
from .setup_tool import get_selection_tag_ids
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:
@ -33,7 +34,12 @@ def index(request):
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})
return render(request, 'frontend/setup.html',
{
'external_page_url': external_page_url,
'page_url': request.GET['url'],
'feed_page_url': reverse('setup_create_feed') # todo: replace with feedpage
})
return HttpResponseBadRequest('Url is required')
@ -64,3 +70,36 @@ def setup_get_selected_ids(request):
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]
#import pdb; pdb.set_trace()
feed = Feed(uri=url, xpath=feed_xpath)
feed.save()
fields = Field.objects.all()
for field in fields:
ff = FeedField(feed=feed, field=field, xpath=item_xpathes[field.name])
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(feed_id)