v/pol
1
0
mirror of https://github.com/taroved/pol synced 2025-06-01 05:50:08 -07:00

setup-tool in progress; +requirements.txt

This commit is contained in:
Alexandr Nesterenko 2015-12-30 13:56:58 +00:00
parent cc9485983c
commit d5b23f0e10
5 changed files with 118 additions and 61 deletions

View File

@ -1,8 +1,8 @@
(function(){ (function(){
var MODE_INACTIVE = 1, var MODE_INACTIVE = 1,
MODE_PICKING = 2, MODE_SELECTING = 2,
MODE_PICKED = 3; MODE_SELECTED = 3;
var itemsData = { var itemsData = {
title: { id: null, elementHoverBg: '#FFEB0D', elementSelectedBg: '#006dcc', elementCalcSelectedBg:"#0044CC", mode: MODE_INACTIVE, name: 'title' }, title: { id: null, elementHoverBg: '#FFEB0D', elementSelectedBg: '#006dcc', elementCalcSelectedBg:"#0044CC", mode: MODE_INACTIVE, name: 'title' },
@ -11,6 +11,19 @@ var itemsData = {
var curItemData = null; var curItemData = null;
function blinkButton(element, times) {
times *= 2;
var show = true;
function toggle() {
element.tooltip(show ? 'show' : 'hide');
times --;
show = !show;
if (times)
setTimeout(toggle, 1000);
}
toggle();
}
//// ////
// +++ calculation of all selections on server side // +++ calculation of all selections on server side
//// ////
@ -62,28 +75,50 @@ function buildJsonFromHtml(doc) {
return iframeHtmlJson; return iframeHtmlJson;
} }
var calculatedSelection = { var calculatedSelection = function(){
_selected_elements: { return {
'title': [], _selected_elements: {
'description': [] 'title': [],
}, 'description': []
},
selectIds: function(data) { selectIds: function(data) {
// unselect old elements var that = this;
alert('To be implemented'); // unselect old elements
// select current elements for (var name in this._selected_elements) {
} this._selected_elements[name].forEach(function(elem){
}; that._unselectCalcElement(elem);
});
this._selected_elements[name] = [];
}
function updateCalculatedSelection(data) { // select current elements
for (var name in data) { for (var name in data) {
var ids = data[name], data[name].forEach(function(id){
itemData_ = itemsData[name]; var elem = $('iframe').contents().find('*[tag-id='+ id +']')[0];
ids.forEach(function(id){ if (id != itemsData[name].id) {
$('iframe').contents().find('*[tag-id='+ curItemData.id +']')[0]; that._selectCalcElement(elem, itemsData[name]);
}); that._selected_elements[name].push(elem);
} }
} });
}
},
unselectItem: function(name) {
this._selected_elements[name].forEach(function(element){
clearBg(element, BG_TYPE_CALC_SELECT);
});
},
_selectCalcElement: function(element, itemData){
setBg(element, itemData.elementSelectedBg, BG_TYPE_CALC_SELECT);
},
_unselectCalcElement: function(element){
clearBg(element, BG_TYPE_CALC_SELECT);
}
};
}();
function calcAllSelections() { function calcAllSelections() {
var htmlJson = buildJsonFromHtml($('iframe').contents()); var htmlJson = buildJsonFromHtml($('iframe').contents());
@ -96,13 +131,13 @@ function calcAllSelections() {
$.ajax({ $.ajax({
type: 'POST', type: 'POST',
url: "/setup_generate_selected_ids", url: "/setup_get_selected_ids",
data: JSON.stringify({ html: htmlJson, names: name_ids }), data: JSON.stringify({ html: htmlJson, names: name_ids }),
contentType: "application/json; charset=utf-8", contentType: "application/json; charset=utf-8",
dataType: "json", dataType: "json",
headers: {"X-CSRFToken": getCookie('csrftoken')}, headers: {"X-CSRFToken": getCookie('csrftoken')},
success: function(data){ success: function(data){
console.log(data); calculatedSelection.selectIds(data);
}, },
failure: function(errMsg) { failure: function(errMsg) {
console.log('Error:'+ errMsg); console.log('Error:'+ errMsg);
@ -125,12 +160,12 @@ function updateButtonAndData(itemData, new_mode, tag_id){
button.addClass('disabled'); button.addClass('disabled');
itemData.id = null; itemData.id = null;
break; break;
case MODE_PICKING: case MODE_SELECTING:
button.css('color', '#FFEB0D'); button.css('color', '#FFEB0D');
button.removeClass('disabled'); button.removeClass('disabled');
itemData.id = null; itemData.id = null;
break; break;
case MODE_PICKED: case MODE_SELECTED:
button.css('color', 'white'); button.css('color', 'white');
itemData.id = tag_id; itemData.id = tag_id;
break; break;
@ -139,10 +174,10 @@ function updateButtonAndData(itemData, new_mode, tag_id){
var BG_DATA_KEY = 'st-origin-background'; var BG_DATA_KEY = 'st-origin-background';
var PICKED_NAMES_KEY = 'st-selected-item-names'; var SELECTED_NAMES_KEY = 'st-selected-item-names';
var CALC_SELECTED_NAMES_KEY = 'st-calculated-selected-item-names'; var CALC_SELECTED_NAMES_KEY = 'st-calculated-selected-item-names';
var BG_TYPE_HOVER = 1 var BG_TYPE_HOVER = 1,
BG_TYPE_SELECT = 2, BG_TYPE_SELECT = 2,
BG_TYPE_CALC_SELECT = 3; BG_TYPE_CALC_SELECT = 3;
@ -152,12 +187,12 @@ function setBg(element, bg, type) {
$(element).data(BG_DATA_KEY, $(element).css('background')); $(element).data(BG_DATA_KEY, $(element).css('background'));
var key = null; var key = null;
switch (type) { switch (type) {
BG_TYPE_HOVER: case BG_TYPE_HOVER:
break; break;
BG_TYPE_SELECT: case BG_TYPE_SELECT:
key = PICKED_NAMES_KEY; key = SELECTED_NAMES_KEY;
break; break;
BG_TYPE_CALC_SELECT: case BG_TYPE_CALC_SELECT:
key = CALC_SELECTED_NAMES_KEY; key = CALC_SELECTED_NAMES_KEY;
break; break;
} }
@ -173,23 +208,22 @@ function setBg(element, bg, type) {
} }
function clearBg(element, type) { function clearBg(element, type) {
if (type == BG_TYPE_SELECT) { // redo for multiselect if (type == BG_TYPE_SELECT) { // redo for multiselect
var picked_names = $(element).data(PICKED_NAMES_KEY); var picked_names = $(element).data(SELECTED_NAMES_KEY);
// remove current item id from element // remove current item id from element
if (picked_names.indexOf(curItemData.name) > -1) if (picked_names.indexOf(curItemData.name) > -1)
picked_names.splice(picked_names.indexOf(curItemData.name), 1); picked_names.splice(picked_names.indexOf(curItemData.name), 1);
} }
var pop = true; var pop = true;
// for first take selection color if element was selected // for first take selection color if element was selected
[PICKED_NAMES_KEY, CALC_SELECTED_NAMES_KEY].forEach(function(key){ [SELECTED_NAMES_KEY, CALC_SELECTED_NAMES_KEY].forEach(function(key){
if (pop) { if (pop) {
var picked_names = $(element).data(key); var picked_names = $(element).data(key);
if (typeof(picked_names) != 'undefined' && picked_names.length) { if (typeof(picked_names) != 'undefined' && picked_names.length) {
var name = picked_names[picked_names.length-1]; var name = picked_names[picked_names.length-1];
$(element).css({'background': itemsData[name].elementSelectedBg}); $(element).css({'background': itemsData[name].elementSelectedBg});
pop = false;
} }
pop = false;
} }
}); });
// get original background if it saved // get original background if it saved
@ -197,14 +231,6 @@ function clearBg(element, type) {
$(element).css({'background': $(element).data(BG_DATA_KEY)}); $(element).css({'background': $(element).data(BG_DATA_KEY)});
} }
function selectCalcElement(element, itemData) {
setBg(element, itemData.elementSelectedBg, BG_TYPE_CALC_SELECT);
}
function UnselectCalcElement(element) {
clearBg(element, BG_TYPE_CALC_SELECT);
}
function selectElement(element, itemData) { function selectElement(element, itemData) {
setBg(element, itemData.elementSelectedBg, BG_TYPE_SELECT); setBg(element, itemData.elementSelectedBg, BG_TYPE_SELECT);
} }
@ -231,15 +257,15 @@ function onIframeElementClick(event) {
return; return;
// unpick by click // unpick by click
if (curItemData.mode == MODE_PICKED && curItemData.id == $(this).attr('tag-id')) { if (curItemData.mode == MODE_SELECTED && curItemData.id == $(this).attr('tag-id')) {
unselectElement($('iframe').contents().find('*[tag-id='+ curItemData.id +']')[0]); unselectElement($('iframe').contents().find('*[tag-id='+ curItemData.id +']')[0]);
updateButtonAndData(curItemData, MODE_PICKING); updateButtonAndData(curItemData, MODE_SELECTING);
styleHoverElement(this); styleHoverElement(this);
} }
// pick by click // pick by click
else if (curItemData.mode == MODE_PICKING) { else if (curItemData.mode == MODE_SELECTING) {
selectElement(this, curItemData); selectElement(this, curItemData);
updateButtonAndData(curItemData, MODE_PICKED, $(this).attr('tag-id')); updateButtonAndData(curItemData, MODE_SELECTED, $(this).attr('tag-id'));
calcAllSelections(); calcAllSelections();
} }
} }
@ -256,7 +282,7 @@ function onIframeElementHover(event) {
return; return;
if ($(this).prop("tagName")) // is not document object if ($(this).prop("tagName")) // is not document object
if (curItemData.mode == MODE_PICKING) if (curItemData.mode == MODE_SELECTING)
if (event.type == 'mouseenter') { if (event.type == 'mouseenter') {
styleHoverElement(this); styleHoverElement(this);
if (this != previous_hover_element) if (this != previous_hover_element)
@ -275,7 +301,7 @@ function onItemButtonClick(event) {
if (curItemData && curItemData != itemsData[item_name]) { if (curItemData && curItemData != itemsData[item_name]) {
// disable another button if it was active // disable another button if it was active
if (curItemData.mode == MODE_PICKING) if (curItemData.mode == MODE_SELECTING)
updateButtonAndData(curItemData, MODE_INACTIVE); updateButtonAndData(curItemData, MODE_INACTIVE);
} }
@ -288,12 +314,13 @@ function onItemButtonClick(event) {
events_ready = true; events_ready = true;
} }
updateButtonAndData(curItemData, MODE_PICKING); updateButtonAndData(curItemData, MODE_SELECTING);
} }
else { // stop picking else { // stop picking
if (curItemData.mode == MODE_PICKED) if (curItemData.mode == MODE_SELECTED)
unselectElement($('iframe').contents().find('*[tag-id='+ curItemData.id +']')[0]); unselectElement($('iframe').contents().find('*[tag-id='+ curItemData.id +']')[0]);
updateButtonAndData(curItemData, MODE_INACTIVE); updateButtonAndData(curItemData, MODE_INACTIVE);
calculatedSelection.unselectItem(curItemData.name);
curItemData = null; curItemData = null;
} }
@ -301,6 +328,10 @@ function onItemButtonClick(event) {
$(document).ready(function(){ $(document).ready(function(){
$(document).on('click', '*[id^="st-"]', onItemButtonClick); $(document).on('click', '*[id^="st-"]', onItemButtonClick);
blinkButton($('#st-title'), 3);
$('#st-title').tooltip('show');
}); });
})(); })();

View File

@ -2,12 +2,13 @@
{% block content %} {% block content %}
<div class="page-header"> <div class="page-header">
<h1 style="display: inline">Feed setup:</h1> <!--h1 style="display: inline">Feed setup:</h1-->
<b id="setup-tool-string"> <h2 style="display: inline" id="setup-tool-string">
You will create feed with You are creating feed with
<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.">Title</button> and <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="st-description" class="btn btn-large btn-info disabled">Description</button>.
</b> </h2>
</div> </div>

View File

@ -25,4 +25,4 @@ urlpatterns = i18n_patterns(
url(r'^admin/', include(admin.site.urls)), url(r'^admin/', include(admin.site.urls)),
) )
urlpatterns.append(url(r'^setup_generate_selected_ids$', views.setup_generate_selected_ids, name='setup_generate_selected_ids')) urlpatterns.append(url(r'^setup_get_selected_ids$', views.setup_get_selected_ids, name='setup_get_selected_ids'))

View File

@ -2,7 +2,7 @@ import urllib
import json import json
from django.views.decorators.csrf import ensure_csrf_cookie from django.views.decorators.csrf import ensure_csrf_cookie
from django.http import HttpResponseRedirect, HttpResponse from django.http import HttpResponseRedirect, HttpResponse, HttpResponseBadRequest
from django.shortcuts import render from django.shortcuts import render
from django.core.validators import URLValidator from django.core.validators import URLValidator
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
@ -35,12 +35,32 @@ def setup(request):
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})
return HttpResponse('Url is required') return HttpResponseBadRequest('Url is required')
def setup_generate_selected_ids(request): 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': if request.method == 'POST':
obj = json.loads(request.body) 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'] html_json = obj['html']
item_names = obj['names'] 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))) return HttpResponse(json.dumps(get_selection_tag_ids(item_names, html_json)))

5
requirements.txt Normal file
View File

@ -0,0 +1,5 @@
Django==1.8.6
Scrapy==1.0.3.post6-g2d688cd
django-pipeline==1.5.4
mysqlclient==1.3.7
w3lib==1.12.0