winix/plugins/ticket/templates.cpp

675 lines
15 KiB
C++
Executable File

/*
* This file is a part of Winix
* and is not publicly distributed
*
* Copyright (c) 2008-2012, Tomasz Sowa
* All rights reserved.
*
*/
#include "ezc.h"
#include "ticketinfo.h"
#include "editticket.h"
#include "createticket.h"
#include "core/request.h"
#include "core/misc.h"
#include "core/plugin.h"
#include "functions/functions.h"
#include "templates/templates.h"
#include "sessiondata.h"
#include "plugins/thread/pluginmsg.h"
#include "templates/miscspace.h"
#include "confparser/space.h"
namespace Ticket
{
using namespace TemplatesFunctions;
using TemplatesFunctions::system;
extern TicketInfo ticket_info;
extern CreateTicket fun_create_ticket;
extern EditTicket fun_edit_ticket;
int ticket_calc_progress_image_number(int percent)
{
percent = int( double(percent) / 10.0 + 0.5 ) * 10;
if( percent < 0 )
percent = 0;
if( percent > 100 )
percent = 100;
return percent;
}
PT::Space & find_add_meta_for_param(PT::Space & meta, long param_id)
{
for(size_t i=0 ; i<meta.spaces.size() ; ++i)
{
PT::Space & sp = *meta.spaces[i];
// !! moze lepiej najpierw zamienic na string i pozniej tylko stringi porownywac (performance)
if( sp.name == L"param" && sp.Long(L"id") == param_id )
{
return sp;
}
}
PT::Space & sp = meta.AddSpace(L"param");
sp.Add(L"id", param_id);
return sp;
}
// binary search for param in ticket.par_tab (ticket.par_tab must be sorted by 'param')
bool find_ticket_param(long param, const Ticket & ticket, size_t & ticket_par_index)
{
if( ticket.par_tab.empty() )
return false;
size_t o1 = 0;
size_t o2 = ticket.par_tab.size() - 1;
if( ticket.par_tab[o1].param == param )
{
ticket_par_index = o1;
return true;
}
if( param < ticket.par_tab[o1].param )
return false;
if( ticket.par_tab[o2].param == param )
{
// looking for the first param
// (there can be more params with the same 'param' value)
while( o2 > 0 && ticket.par_tab[o2-1].param == param )
--o2;
ticket_par_index = o2;
return true;
}
if( param > ticket.par_tab[o2].param )
return false;
while( o1 + 1 < o2 )
{
ticket_par_index = (o1 + o2) / 2;
if( ticket.par_tab[ticket_par_index].param == param )
{
while( ticket_par_index > 0 && ticket.par_tab[ticket_par_index-1].param == param )
--ticket_par_index;
return true;
}
if( ticket.par_tab[ticket_par_index].param < param )
o1 = ticket_par_index;
else
o2 = ticket_par_index;
}
return false;
}
void ticket_print_value(Info & i, PT::Space & space, const Ticket::TicketParam & ticket_param, PT::Space & meta)
{
std::wstring & type = space.Text(L"type");
if( type == L"integer" || type == L"progress" )
{
i.out << ticket_param.intv;
}
else
if( type == L"select" )
{
for(size_t a=0 ; a<space.spaces.size() ; ++a)
{
PT::Space & sp = *space.spaces[a];
if( sp.name == L"option" && Tol(sp.Text(L"id")) == ticket_param.intv )
{
i.out << sp.Text(L"value");
break;
}
}
}
else
if( type == L"string" || type == L"multistring" )
{
i.out << meta.Text(L"value");
}
else
if( type == L"images" || type == L"files" )
{
i.out << meta.Text(L"value");
}
}
void ticket_can_create(Info & i)
{
i.res = fun_create_ticket.HasAccess();
}
void ticket_can_edit(Info & i)
{
i.res = fun_edit_ticket.HasAccess();
}
namespace ns_tickets_tab
{
static size_t item_sort_index; // index for: ticket_info.item_sort_tab
static size_t ticket_index; // index for: ticket_info.ticket_tab
static size_t par_index; // index for: ticket_info.ticket_tab[ticket_index].par_tab
static size_t conf_tab_index; // index for: ticket_info.cur_conf->spaces
static bool has_ticket;
static bool has_value;
// binary search for id in ticket_tab (ticket_tab must be sorted by 'file_id')
bool find_ticket(const std::vector<Ticket> & ticket_tab, long id, size_t & ticket_index)
{
if( ticket_tab.empty() )
return false;
size_t o1 = 0;
size_t o2 = ticket_tab.size() - 1;
if( ticket_tab[o1].file_id == id )
{
ticket_index = o1;
return true;
}
if( id < ticket_tab[o1].file_id )
return false;
if( ticket_tab[o2].file_id == id )
{
ticket_index = o2;
return true;
}
if( id > ticket_tab[o2].file_id )
return false;
while( o1 + 1 < o2 )
{
ticket_index = (o1 + o2) / 2;
if( ticket_tab[ticket_index].file_id == id )
return true;
if( ticket_tab[ticket_index].file_id < id )
o1 = ticket_index;
else
o2 = ticket_index;
}
return false;
}
void tickets_tab(Info & i)
{
has_ticket = false;
item_sort_index = i.iter;
i.res = item_sort_index < ticket_info.item_sort_tab.size();
if( i.res )
{
long id = ticket_info.item_sort_tab[item_sort_index]->id;
has_ticket = find_ticket(ticket_info.ticket_tab, id, ticket_index);
plugin.Call(WINIX_PL_THREAD_SET_SORTTAB_INDEX, item_sort_index);
}
}
void tickets_tab_url(Info & i)
{
if( item_sort_index < ticket_info.item_sort_tab.size() )
i.out << ticket_info.item_sort_tab[item_sort_index]->url;
}
void tickets_tab_subject_empty(Info & i)
{
if( item_sort_index < ticket_info.item_sort_tab.size() )
i.res = ticket_info.item_sort_tab[item_sort_index]->subject.empty();
}
void tickets_tab_subject(Info & i)
{
if( item_sort_index < ticket_info.item_sort_tab.size() )
i.out << ticket_info.item_sort_tab[item_sort_index]->subject;
}
// !! do czego to w ogole sluzy?
void tickets_tab_has_value(Info & i)
{
if( has_ticket && ticket_index < ticket_info.ticket_tab.size() )
{
size_t par_index;
long id = Tol(i.par);
Ticket & ticket = ticket_info.ticket_tab[ticket_index];
// !! dodac takze sprawdzanie czy jest wartosc w ticket_info.ticket->meta
if( find_ticket_param(id, ticket, par_index) )
i.res = true;
}
}
// !! czy to w ogole jest gdzies uzywane?
void tickets_tab_value_int(Info & i)
{
if( has_ticket && ticket_index < ticket_info.ticket_tab.size() )
{
size_t par_index;
long param = Tol(i.par);
Ticket & ticket = ticket_info.ticket_tab[ticket_index];
if( find_ticket_param(param, ticket, par_index) )
i.out << ticket.par_tab[par_index].intv;
}
}
// !! czy to w ogole jest gdzies uzywane?
void tickets_tab_value_meta(Info & i)
{
if( has_ticket &&
item_sort_index < ticket_info.item_sort_tab.size() &&
ticket_index < ticket_info.ticket_tab.size() )
{
long param = Tol(i.par);
PT::Space & meta = ticket_info.item_sort_tab[item_sort_index]->meta.FindAddSpace(L"ticket");
PT::Space & sp = find_add_meta_for_param(meta, param);
// !! to nie zadziala bo pierwszy parametr w i.par to jest param_id
space(i, sp);
}
}
void tickets_tab_conf_tab(Info & i)
{
has_value = false;
if( has_ticket &&
item_sort_index < ticket_info.item_sort_tab.size() &&
ticket_index < ticket_info.ticket_tab.size() )
{
if( i.iter == 0 )
conf_tab_index = 0;
else
conf_tab_index += 1;
PT::Space & space = *ticket_info.cur_conf;
for( ; conf_tab_index < space.spaces.size() ; conf_tab_index++)
if( space.spaces[conf_tab_index]->name == L"param" )
break;
i.res = conf_tab_index < space.spaces.size();
if( i.res )
{
PT::Space & sp = *space.spaces[conf_tab_index];
const Ticket & ticket = ticket_info.ticket_tab[ticket_index];
has_value = find_ticket_param(sp.Long(L"id"), ticket, par_index);
}
}
}
void tickets_tab_conf_tab_has_value(Info & i)
{
i.res = has_value;
}
void tickets_tab_conf_tab_value(Info & i)
{
if( has_value &&
conf_tab_index < ticket_info.cur_conf->spaces.size() &&
item_sort_index < ticket_info.item_sort_tab.size() &&
ticket_index < ticket_info.ticket_tab.size() &&
par_index < ticket_info.ticket_tab[ticket_index].par_tab.size() )
{
PT::Space & space = *ticket_info.cur_conf->spaces[conf_tab_index];
// !! to mozna jakos gdzies zapamietac
// aby nie wyszukiwac ciagle
PT::Space & meta_ticket = ticket_info.item_sort_tab[item_sort_index]->meta.FindAddSpace(L"ticket");
PT::Space & meta = find_add_meta_for_param(meta_ticket, space.Long(L"id"));
ticket_print_value(i, space, ticket_info.ticket_tab[ticket_index].par_tab[par_index], meta);
}
}
void tickets_tab_conf_tab_type_is(Info & i)
{
if( conf_tab_index < ticket_info.cur_conf->spaces.size() )
{
PT::Space & space = *ticket_info.cur_conf->spaces[conf_tab_index];
i.res = (space.Text(L"type") == i.par);
}
}
void tickets_tab_conf_tab_progress_image_number(Info & i)
{
if( has_value &&
ticket_index < ticket_info.ticket_tab.size() &&
par_index < ticket_info.ticket_tab[ticket_index].par_tab.size() )
{
int progress = ticket_info.ticket_tab[ticket_index].par_tab[par_index].intv;
i.out << ticket_calc_progress_image_number(progress);
}
}
} // namespace ns_tickets_tab
namespace ns_ticket_tab
{
static size_t conf_index; // index for: ticket_info.cur_conf->spaces
static size_t select_index; // index for: ticket_info.cur_conf->spaces[conf_index]->spaces
static size_t par_index; // index for: ticket_info.ticket->par_tab
static size_t files_number;
static bool has_value;
void ticket_tab(Info & i)
{
if( i.iter == 0 )
conf_index = 0;
else
conf_index += 1;
PT::Space & space = *ticket_info.cur_conf;
for( ; conf_index < space.spaces.size() ; conf_index++)
if( space.spaces[conf_index]->name == L"param" )
break;
i.res = conf_index < space.spaces.size();
if( i.res )
{
PT::Space & sp = *space.spaces[conf_index];
has_value = find_ticket_param(sp.Long(L"id"), *ticket_info.ticket, par_index);
}
}
void ticket_tab_param_id(Info & i)
{
if( conf_index < ticket_info.cur_conf->spaces.size() )
i.out << ticket_info.cur_conf->spaces[conf_index]->Long(L"id");
}
void ticket_tab_param_name(Info & i)
{
if( conf_index < ticket_info.cur_conf->spaces.size() )
i.out << ticket_info.cur_conf->spaces[conf_index]->Text(L"name");
}
void ticket_tab_value(Info & i)
{
// !! has_value mowi tylko czy opcja byla w tabeli tickets
// nalezy dodac aby has_value mialo obsluge meta (albo sie pozbyc go w ogole...)
if( has_value && par_index < ticket_info.ticket->par_tab.size() &&
conf_index < ticket_info.cur_conf->spaces.size() )
{
PT::Space & space = *ticket_info.cur_conf->spaces[conf_index];
PT::Space & meta = find_add_meta_for_param(ticket_info.item->meta.FindAddSpace(L"ticket"), space.Long(L"id"));
ticket_print_value(i, space, ticket_info.ticket->par_tab[par_index], meta);
}
}
void ticket_tab_value_int(Info & i)
{
if( has_value && par_index < ticket_info.ticket->par_tab.size() )
i.out << ticket_info.ticket->par_tab[par_index].intv;
}
void ticket_tab_value_meta(Info & i)
{
if( has_value && par_index < ticket_info.ticket->par_tab.size() )
{
PT::Space & sp = *ticket_info.cur_conf->spaces[conf_index];
PT::Space & meta = find_add_meta_for_param(ticket_info.item->meta.FindAddSpace(L"ticket"), sp.Long(L"id"));
space(i, meta);
}
}
void ticket_tab_type_is(Info & i)
{
if( conf_index < ticket_info.cur_conf->spaces.size() )
{
PT::Space & space = *ticket_info.cur_conf->spaces[conf_index];
i.res = (space.Text(L"type") == i.par);
}
}
void ticket_tab_select_tab(Info & i)
{
if( conf_index < ticket_info.cur_conf->spaces.size() )
{
if( i.iter == 0 )
select_index = 0;
else
select_index += 1;
PT::Space & sp = *ticket_info.cur_conf->spaces[conf_index];
for( ; select_index < sp.spaces.size() ; ++select_index)
if( sp.spaces[select_index]->name == L"option" )
break;
i.res = (select_index < sp.spaces.size());
}
}
void ticket_tab_select_tab_is_selected(Info & i)
{
if( conf_index < ticket_info.cur_conf->spaces.size() &&
select_index < ticket_info.cur_conf->spaces[conf_index]->spaces.size() )
{
PT::Space & sp = *ticket_info.cur_conf->spaces[conf_index];
long id = sp.spaces[select_index]->Long(L"id");
if( has_value && par_index < ticket_info.ticket->par_tab.size() )
{
i.res = (id == ticket_info.ticket->par_tab[par_index].intv);
}
else
{
i.res = (id == sp.Long(L"default"));
}
}
}
void ticket_tab_select_tab_name(Info & i)
{
if( conf_index < ticket_info.cur_conf->spaces.size() &&
select_index < ticket_info.cur_conf->spaces[conf_index]->spaces.size() )
{
i.out << ticket_info.cur_conf->spaces[conf_index]->spaces[select_index]->Text(L"value");
}
}
void ticket_tab_select_tab_id(Info & i)
{
if( conf_index < ticket_info.cur_conf->spaces.size() &&
select_index < ticket_info.cur_conf->spaces[conf_index]->spaces.size() )
{
i.out << ticket_info.cur_conf->spaces[conf_index]->spaces[select_index]->Text(L"id");
}
}
void ticket_tab_files_tab(Info & i)
{
files_number = i.iter;
if( has_value && conf_index < ticket_info.cur_conf->spaces.size() )
{
if( i.iter == 0 )
{
// first iteration, we are using the par_index found by previous call to ticket_tab
i.res = true;
return;
}
else
{
// next iteration, we are looking for the next par_index
PT::Space & sp = *ticket_info.cur_conf->spaces[conf_index];
long param = sp.Long(L"id");
for(++par_index ; par_index < ticket_info.ticket->par_tab.size() ; ++par_index)
{
if( ticket_info.ticket->par_tab[par_index].param == param )
{
i.res = true;
return;
}
}
// there are no more such items
has_value = false;
i.res = false;
}
}
}
void ticket_tab_files_tab_index(Info & i)
{
i.out << files_number;
}
} // namespace ns_ticket_tab
void AddEzcFunctions(PluginInfo & info)
{
using namespace ns_tickets_tab;
using namespace ns_ticket_tab;
using TemplatesFunctions::EzcFun;
EzcFun * fun = reinterpret_cast<EzcFun*>(info.p1);
fun->Insert("ticket_can_create", ticket_can_create);
fun->Insert("ticket_can_edit", ticket_can_edit);
fun->Insert("tickets_tab", tickets_tab);
fun->Insert("tickets_tab_url", tickets_tab_url);
fun->Insert("tickets_tab_subject_empty", tickets_tab_subject_empty);
fun->Insert("tickets_tab_subject", tickets_tab_subject);
// you should provide an id (param) as a first parameter
fun->Insert("tickets_tab_has_value", tickets_tab_has_value);
fun->Insert("tickets_tab_value_int", tickets_tab_value_int);
fun->Insert("tickets_tab_value_meta", tickets_tab_value_meta);
fun->Insert("tickets_tab_conf_tab", tickets_tab_conf_tab);
fun->Insert("tickets_tab_conf_tab_has_value", tickets_tab_conf_tab_has_value);
fun->Insert("tickets_tab_conf_tab_value", tickets_tab_conf_tab_value);
fun->Insert("tickets_tab_conf_tab_type_is", tickets_tab_conf_tab_type_is);
fun->Insert("tickets_tab_conf_tab_progress_image_number", tickets_tab_conf_tab_progress_image_number);
fun->Insert("ticket_tab", ticket_tab);
fun->Insert("ticket_tab_param_id", ticket_tab_param_id);
fun->Insert("ticket_tab_param_name", ticket_tab_param_name);
fun->Insert("ticket_tab_value", ticket_tab_value);
fun->Insert("ticket_tab_value_int", ticket_tab_value_int);
fun->Insert("ticket_tab_value_meta", ticket_tab_value_meta);
fun->Insert("ticket_tab_type_is", ticket_tab_type_is);
fun->Insert("ticket_tab_select_tab", ticket_tab_select_tab);
fun->Insert("ticket_tab_select_tab_is_selected", ticket_tab_select_tab_is_selected);
fun->Insert("ticket_tab_select_tab_id", ticket_tab_select_tab_id);
fun->Insert("ticket_tab_select_tab_name", ticket_tab_select_tab_name);
fun->Insert("ticket_tab_files_tab", ticket_tab_files_tab);
fun->Insert("ticket_tab_files_tab_index", ticket_tab_files_tab_index);
}
} // namespace Ticket