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:
|
for name in item_tag_ids:
|
||||||
tag_id = item_tag_ids[name]
|
tag_id = item_tag_ids[name]
|
||||||
parent_stacks[name] = _build_parent_stack(html_json, tag_id)
|
parent_stacks[name] = _build_parent_stack(html_json, tag_id)
|
||||||
#import pdb; pdb.set_trace()
|
|
||||||
# get fork
|
# get fork
|
||||||
fork_stack = _get_fork_stack(parent_stacks)
|
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])
|
selection_ids[name].append(ids[name])
|
||||||
|
|
||||||
return selection_ids
|
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');
|
$(button).css('color', 'white');
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
updateCreateButton();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -289,11 +290,7 @@ function buildJsonFromHtml(doc) {
|
|||||||
return iframeHtmlJson;
|
return iframeHtmlJson;
|
||||||
}
|
}
|
||||||
|
|
||||||
function requestSelection() {
|
function gatherSelectedTagIds(name_ids) {
|
||||||
var htmlJson = buildJsonFromHtml($('iframe').contents());
|
|
||||||
|
|
||||||
// gather selected tag-ids
|
|
||||||
var name_ids = {};
|
|
||||||
var selected_any = false;
|
var selected_any = false;
|
||||||
for (var name in items) {
|
for (var name in items) {
|
||||||
if ([STATE_SELECTING, STATE_SELECTED].indexOf(items[name].state) != -1) {
|
if ([STATE_SELECTING, STATE_SELECTED].indexOf(items[name].state) != -1) {
|
||||||
@ -301,6 +298,15 @@ function requestSelection() {
|
|||||||
selected_any = true;
|
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)
|
if (selected_any)
|
||||||
return new Promise(function(resolve, reject){
|
return new Promise(function(resolve, reject){
|
||||||
@ -353,6 +359,7 @@ function onIframeElementHover(event) {
|
|||||||
}
|
}
|
||||||
else { // mouseleave
|
else { // mouseleave
|
||||||
// clear all hover styles
|
// clear all hover styles
|
||||||
|
// if mouseleave calls after mouseenter we may have a problem
|
||||||
styleTool.unstyleAll('hover');
|
styleTool.unstyleAll('hover');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -388,11 +395,79 @@ function onItemButtonClick(event) {
|
|||||||
curItemData = null;
|
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(){
|
$(document).ready(function(){
|
||||||
items['title'] = new Item('title', $('#st-title')[0]);
|
items['title'] = new Item('title', $('#st-title')[0]);
|
||||||
items['description'] = new Item('description', $('#st-description')[0]);
|
items['description'] = new Item('description', $('#st-description')[0]);
|
||||||
|
|
||||||
|
$('#create').click(onCreateButtonClick);
|
||||||
|
|
||||||
$('iframe').load(function(){
|
$('iframe').load(function(){
|
||||||
// init id2el
|
// init id2el
|
||||||
$('iframe').contents().find('*[tag-id]').each(function(){
|
$('iframe').contents().find('*[tag-id]').each(function(){
|
||||||
@ -401,7 +476,6 @@ $(document).ready(function(){
|
|||||||
// attach iframe elements event handlers
|
// attach iframe elements event handlers
|
||||||
$('iframe').contents().on('click', '*[tag-id]', onIframeElementClick);
|
$('iframe').contents().on('click', '*[tag-id]', onIframeElementClick);
|
||||||
$('iframe').contents().on('mouseenter mouseleave', '*[tag-id]', onIframeElementHover);
|
$('iframe').contents().on('mouseenter mouseleave', '*[tag-id]', onIframeElementHover);
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
blinkButton($('#st-title'), 3);
|
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."
|
<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
|
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="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>
|
</h2>
|
||||||
</div>
|
</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_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 .forms import IndexForm
|
||||||
from .settings import DOWNLOADER_PAGE_URL
|
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):
|
def index(request):
|
||||||
if request.method == 'GET' and 'url' in request.GET:
|
if request.method == 'GET' and 'url' in request.GET:
|
||||||
@ -33,7 +34,12 @@ def index(request):
|
|||||||
def setup(request):
|
def setup(request):
|
||||||
if request.method == 'GET' and 'url' in request.GET:
|
if request.method == 'GET' and 'url' in request.GET:
|
||||||
external_page_url = DOWNLOADER_PAGE_URL + urllib.quote(request.GET['url'], safe='')
|
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')
|
return HttpResponseBadRequest('Url is required')
|
||||||
|
|
||||||
@ -64,3 +70,36 @@ def setup_get_selected_ids(request):
|
|||||||
return HttpResponseBadRequest('html is invalid')
|
return HttpResponseBadRequest('html is invalid')
|
||||||
|
|
||||||
return HttpResponse(json.dumps(get_selection_tag_ids(item_names, html_json)))
|
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