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:
parent
f29c14699e
commit
54e6dd0462
@ -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]
|
||||
|
@ -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);
|
||||
|
@ -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>
|
||||
|
||||
|
@ -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'))
|
||||
|
@ -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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user