From e95281742330e9b108d10421ed14cba991759edd Mon Sep 17 00:00:00 2001 From: Sergey Morozov Date: Fri, 18 Apr 2014 23:34:12 +0400 Subject: [PATCH] Moved to Git repo from PST server --- htdocs/.htaccess | 16 ++ htdocs/include/bc.py | 436 +++++++++++++++++++++++++++++++++++++++++++ htdocs/index.py | 327 ++++++++++++++++++++++++++++++++ passwords | 0 4 files changed, 779 insertions(+) create mode 100644 htdocs/.htaccess create mode 100644 htdocs/include/bc.py create mode 100644 htdocs/index.py create mode 100644 passwords diff --git a/htdocs/.htaccess b/htdocs/.htaccess new file mode 100644 index 0000000..1170e3b --- /dev/null +++ b/htdocs/.htaccess @@ -0,0 +1,16 @@ +AuthType Basic +AuthName "Restricted Access" +AuthUserFile /path/to/file/with/passwords +Require valid-user + +AddHandler mod_python .py +PythonHandler mod_python.publisher +PythonDebug On +# + Options -Indexes + RedirectMatch "^/+$" /index.py/view + RedirectMatch "^/index.py+$" /index.py/view + RedirectMatch "^/imp+$" /index.py/imp + RedirectMatch "^/view+$" /index.py/view + RedirectMatch "^/delete+$" /index.py/delete +# diff --git a/htdocs/include/bc.py b/htdocs/include/bc.py new file mode 100644 index 0000000..c94c0f7 --- /dev/null +++ b/htdocs/include/bc.py @@ -0,0 +1,436 @@ +#!/usr/bin/env python +class table: + def __init__(self, db, name, columns): + self.db = db # database connection + self.name = name # table name + self.columns = columns + self.dbc = self.db.cursor() # cursor object + self.debug = 0 + self.order = '' + self.qfilter = '' + self.selectopts = '' + +# def _sqlvalue(self, value): +# if value == None: +# return 'NULL' +# else: +# return value + + def _getorder(self): + if len(self.order) > 0: + orderstr = 'ORDER BY `%s`' % self.order + else: + orderstr = '' + return orderstr + +# def _enumquoted(self, list): +# result = '' +# for i in xrange(len(list)-1): +# result = '%s\'%s\', ' % (result, self._sqlvalue(list[i])) +# result = '%s%s' % (result, self._sqlvalue(list[i+1])) +# return result + +# def _gensubstitute(self, list): +# result = '' +# for i in xrange(len(list)-1): +# result += '%r, ' +# result = result + '%r' +# return result + + def _listtotuple(self, list): + result = () + for i in xrange(len(list)): + result += (list[i],) + return result + + def _enumquotedreverse(self, list): + result = '' + if (len(list)) > 1: + for i in xrange(len(list)-1): + if list[i] == None: + result = result + 'NULL' + ', ' + else: + result = result + '`%s`, ' % list[i] + result = result + '`' + list[i+1] + '`' + else: + result = list[0] + return result + + def _replacelist(self, list): + result = '' + for i in xrange(len(list)-1): + result += '%s, ' + result +='%s' + return result + + def __getitem__(self, item): + self._query("SELECT %s %s FROM %s %s %s LIMIT %s, 1" % (self.selectopts, self._enumquotedreverse(self.columns), self.name, self.qfilter, self._getorder(), item)) + return self.dbc.fetchone() + + def _query(self, q, values = ()): + if self.debug == 1: + print "Query: %s" % (q) + self.dbc.execute(q, values) + + def __iter__(self): + "creates a data set, and returns an iterator (self)" + q = "SELECT %s %s FROM %s %s %s" % (self.selectopts, self._enumquotedreverse(self.columns), self.name, self.qfilter, self._getorder()) + self._query(q) + return self + + def __len__(self): + self.__iter__() + return int(self.dbc.rowcount) + + def setfilter(self, filterstr): + self.qfilter = filterstr + q = "SELECT %s %s FROM %s %s %s" % (self.selectopts, self._enumquotedreverse(self.columns), self.name, self.qfilter, self._getorder()) + self._query(q) + + def setorder(self, orderstr): + self.order = orderstr + q = "SELECT %s %s FROM %s %s %s" % (self.selectopts, self._enumquotedreverse(self.columns), self.name, self.qfilter, self._getorder()) + self._query(q) + + def next(self): + "returns the next item in the data set, or tells Python to stop" + r = self.dbc.fetchone() + if not r: + raise StopIteration + return r + + def append(self, values): + q = 'INSERT INTO %s (%s) VALUES (%s)' % (self.name, self._enumquotedreverse(self.columns), self._replacelist(values)) + self._query(q, self._listtotuple(values)) + + def delete_by_filter(self, qfilter): + q = 'DELETE FROM %s %s' % (self.name, qfilter) + self._query(q) + + def create(self, parameters): + q = 'CREATE TABLE `%s` (' % self.name + for i in xrange(len(self.columns)-1): + q = '%s `%s` %s,' % (q, self.columns[i], parameters[i]) + q = '%s `%s` %s)' % (q, self.columns[i+1], parameters[i+1]) + self._query(q) + + def create_if_not_exists(self, parameters): + q = 'CREATE TABLE IF NOT EXISTS `%s` (' % self.name + for i in xrange(len(self.columns)-1): + q = '%s `%s` %s,' % (q, self.columns[i], parameters[i]) + q = '%s `%s` %s)' % (q, self.columns[i+1], parameters[i+1]) + self._query(q) + +class vcards: + class __card__: + def __init__(self): + r.company = '' + r.firstName = None + r.lastName = None + r.title = None + r.city = None + r.country = None + r.address = None + r.zipCode = None + r.state = None + r.email = None + r.webSite = None + r.phone = None + r.phone2 = None + r.fax = None + r.cellPhone = None + r.image = None + + def __init__(self, vcfdata): + import vobject + vcard_delemiter = "\nEND:VCARD" + self.vcfdata = vcfdata + vcards = vcfdata.split(vcard_delemiter) + del(vcards[len(vcards)-1]) + self.v = [] + _nextPos = 0 + for i in xrange(len(vcards)): + vcards[i] = vcards[i] + vcard_delemiter + self.v.append(vobject.readOne(vcards[i].replace(';QUOTED-PRINTABLE',''))) + + def _rmspaces(self, val): + try: + for i in xrange(len(val)): + if val[0] == ' ': + val = val[1:] + if val == '': + result = None + else: + result = val + except: + result = val + return result + + def _normalize(self, val): + if type(val) == type([]): + result = '' + for i in xrange(len(val)-1): + result += '%s, ' % val[i] + result += '%s' % val[i + 1] + else: + result = val + result = self._rmspaces(result) + return result + + def _getFirstName(self, vcard): + try: + result = vcard.n.value.given + except: + result = None + return self._normalize(result) + + def _getLastName(self, vcard): + try: + result = vcard.n.value.family + except: + result = None + return self._normalize(result) + + def _getCity(self, vcard): + try: + result = vcard.adr.value.city + except: + result = None + return self._normalize(result) + + def _getCountry(self, vcard): + try: + result = vcard.adr.value.country + except: + result = None + return self._normalize(result) + + def _getAddress(self, vcard): + try: + result = vcard.adr.value.street + except: + result = None + return self._normalize(result) + + def _getZipCode(self, vcard): + try: + result = vcard.adr.value.code + except: + result = None + return self._normalize(result) + + def _getState(self, vcard): + try: + result = vcard.adr.value.region + except: + result = None + return self._normalize(result) + + def _getEmail(self, vcard): + try: + result = vcard.email.value + except: + result = None + return self._normalize(result) + + def _getWebSite(self, vcard): + try: + result = vcard.url.value + except: + result = None + return self._normalize(result) + + def _getTitle(self, vcard): + try: + result = vcard.title.value + except: + result = None + return self._normalize(result) + + def _getCompany(self, vcard): + try: + result = vcard.org.value[0] + except: + result = None + return self._normalize(result) + + def _getImage(self, vcard): + try: + result = vcard.photo.value + except: + result = None + return result + + def _getPhone(self, vcard): + try: + tel = vcard.tel_list + for i in xrange(len(tel)): + pref = False + work = False + voice = False + cell = False + fax = False + for j in xrange(len(tel[i].singletonparams)): + if tel[i].singletonparams[j] == 'PREF': pref = True + if tel[i].singletonparams[j] == 'WORK': work = True + if tel[i].singletonparams[j] == 'VOICE': voice = True + if tel[i].singletonparams[j] == 'CELL': cell = True + if tel[i].singletonparams[j] == 'FAX': fax = True + if pref == True and work == True and voice == True and cell == False and fax == False: + found = 1 + break + if found == True: + result = tel[i].value + else: + result = None + except: + result = None + return self._normalize(result) + + def _getPhone2(self, vcard): + try: + tel = vcard.tel_list + for i in xrange(len(tel)): + pref = False + work = False + voice = False + cell = False + fax = False + for j in xrange(len(tel[i].singletonparams)): + if tel[i].singletonparams[j] == 'PREF': pref = True + if tel[i].singletonparams[j] == 'WORK': work = True + if tel[i].singletonparams[j] == 'VOICE': voice = True + if tel[i].singletonparams[j] == 'CELL': cell = True + if tel[i].singletonparams[j] == 'FAX': fax = True + if pref == False and work == True and voice == True and cell == False and fax == False: + found = 1 + break + if found == True: + result = tel[i].value + else: + result = None + except: + result = None + return self._normalize(result) + + def _getFax(self, vcard): + try: + tel = vcard.tel_list + for i in xrange(len(tel)): + pref = False + work = False + voice = False + cell = False + fax = False + for j in xrange(len(tel[i].singletonparams)): + if tel[i].singletonparams[j] == 'PREF': pref = True + if tel[i].singletonparams[j] == 'WORK': work = True + if tel[i].singletonparams[j] == 'VOICE': voice = True + if tel[i].singletonparams[j] == 'CELL': cell = True + if tel[i].singletonparams[j] == 'FAX': fax = True + if pref == False and work == True and voice == False and cell == False and fax == True: + found = 1 + break + if found == True: + result = tel[i].value + else: + result = None + except: + result = None + return self._normalize(result) + + def _getCellPhone(self, vcard): + try: + tel = vcard.tel_list + for i in xrange(len(tel)): + pref = False + work = False + voice = False + cell = False + fax = False + for j in xrange(len(tel[i].singletonparams)): + if tel[i].singletonparams[j] == 'PREF': pref = True + if tel[i].singletonparams[j] == 'WORK': work = True + if tel[i].singletonparams[j] == 'VOICE': voice = True + if tel[i].singletonparams[j] == 'CELL': cell = True + if tel[i].singletonparams[j] == 'FAX': fax = True + if pref == False and work == False and voice == True and cell == True and fax == False: + found = 1 + break + if found == True: + result = tel[i].value + else: + result = None + except: + result = None + return self._normalize(result) + + def __iter__(self): + return self + + def __getitem__(self, item): + r = self.__card__ + r.company = self._getCompany(self.v[item]) + r.firstName = self._getFirstName(self.v[item]) + r.lastName = self._getLastName(self.v[item]) + r.title = self._getTitle(self.v[item]) + r.city = self._getCity(self.v[item]) + r.country = self._getCountry(self.v[item]) + r.address = self._getAddress(self.v[item]) + r.zipCode = self._getZipCode(self.v[item]) + r.state = self._getState(self.v[item]) + r.email = self._getEmail(self.v[item]) + r.webSite = self._getWebSite(self.v[item]) + r.phone = self._getPhone(self.v[item]) + r.phone2 = self._getPhone2(self.v[item]) + r.fax = self._getFax(self.v[item]) + r.cellPhone = self._getCellPhone(self.v[item]) + r.image = self._getImage(self.v[item]) + return r + + + def next(self): + r = self.__card__ + if not self.v[_nextPos]: + raise StopIteration + else: + r.company = self._getCompany(self.v[self._nextPos]) + r.firstName = self._getFirstName(self.v[self._nextPos]) + r.lastName = self._getLastName(self.v[self._nextPos]) + r.title = self._getTitle(self.v[self._nextPos]) + r.city = self._getCity(self.v[self._nextPos]) + r.country = self._getCountry(self.v[self._nextPos]) + r.address = self._getAddress(self.v[self._nextPos]) + r.zipCode = self._getZipCode(self.v[self._nextPos]) + r.state = self._getState(self.v[self._nextPos]) + r.email = self._getEmail(self.v[self._nextPos]) + r.webSite = self._getWebSite(self.v[self._nextPos]) + r.phone = self._getPhone(self.v[self._nextPos]) + r.phone2 = self._getPhone2(self.v[self._nextPos]) + r.fax = self._getFax(self.v[self._nextPos]) + r.cellPhone = self._getCellPhone(self.v[self._nextPos]) + r.image = self._getImage(self.v[self._nextPos]) + self._nextPos = self._nextPos + 1 + return r + + def __len__(self): + return len(self.v) + +# +#for i in xrange(len(v)): +# print 'Company: %s' % _getCompany(v[i]) +# print 'First name: %s' % _getFirstName(v[i]) +# print 'Last name: %s' % _getLastName(v[i]) +# print 'Title: %s' % _getTitle(v[i]) +# print 'City: %s' % _getCity(v[i]) +# print 'Country: %s' % _getCountry(v[i]) +# print 'Address: %s' % _getAddress(v[i]) +# print 'Zip code: %s ' % _getZipCode(v[i]) +# print 'State: %s' % _getState(v[i]) +# print 'Email: %s' % _getEmail(v[i]) +# print 'Web site: %s' % _getWebSite(v[i]) +# print 'Phone: %s' % _getPhone(v[i]) +# print 'Phone2: %s' % _getPhone2(v[i]) +# print 'Fax: %s' % _getFax(v[i]) +# print 'Cell phone: %s' % _getCellPhone(v[i]) +# print '------------------------------------------------------' diff --git a/htdocs/index.py b/htdocs/index.py new file mode 100644 index 0000000..46579bc --- /dev/null +++ b/htdocs/index.py @@ -0,0 +1,327 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import sys, os, MySQLdb, binascii +from mod_python import apache, util +from htmlgen import HTMLgen + +DB_NAME = 'bc' +DB_HOST = 'localhost' +DB_USER = 'bc' +DB_PASSWORD = 'super-secret-password' + +ITEMS_PER_PAGE = 25 + +def _init(req): + sys.path.append(os.path.dirname(req.filename) + "/include") + +def _pageTitle(req, meta='', title=''): + if len(title) > 0: + title += ' - ' + if len(meta) > 0: + meta = '\n' % meta + page = '\n'\ + '\n'\ + '\n'\ + '\n'\ + '%s' % meta +\ + '%sBusiness cards\n' %title +\ + '\n'\ + '\n'\ + '\n'\ + '

Business cards

\n' + return page + +def _pageFooter(req): + page = '

©2010 Сергей Морозов, ОАО \"Промышленно - строительное товарищество\"

\n'\ + '
\n'\ + '\n'\ + '\n' + return page + +def _pageImpForm(req): + page = '

Импорт записей из .vcf файлов

\n'\ + '
\n'\ + 'Выберите файл: \n'\ + '\n'\ + ''\ + '
\n'\ + '
\n'\ + 'Удаление ранее загруженных записей\n'\ + % req.uri + return page + +def _pageDone(req, additional = ''): + page = 'Операция завершена.
%s' % additional + return page + +def _pageDeleteForm(req, list): + liststring = '' + for i in xrange(len(list)): + liststring += '