Переделан конфиг (под dev и production)

This commit is contained in:
Jack Stdin 2016-01-31 23:23:52 +03:00
parent c65f78dd06
commit 1a221d9a93
16 changed files with 117 additions and 106 deletions

View File

@ -1,50 +0,0 @@
# -*- coding: utf-8 -*-
from platform import system
config_type = "production"
if "Windows" in system():
config_type = "test"
DB_INSTANCES = dict(
test=dict(
host="localhost",
user="postgres",
password="intercon",
database="postgres",
port=5432
),
production=dict(
host="localhost",
user="***",
password="***",
database="***",
port=5432
)
)
UNRAR_PATHES = dict(
test="C:\Program Files (x86)\WinRAR\unrar.exe",
production="unrar"
)
SPHINX_VAR_DIRS = dict(
test="C:/Sphinx",
production="/var/sphinx"
)
# Uncomment if you want to specify config_type manually
# config_type = "test"
# Main section
sphinx = dict(
host_name="localhost",
port=9312,
index_addjobj="idx_fias_addrobj",
index_sugg="idx_fias_sugg",
var_dir=SPHINX_VAR_DIRS[config_type]
)
db = DB_INSTANCES[config_type]
unrar = UNRAR_PATHES[config_type]
trashfolder = "files/"

4
aore/config/__init__.py Normal file
View File

@ -0,0 +1,4 @@
# -*- coding: utf-8 -*-
from __future__ import absolute_import
from .dev import *

24
aore/config/common.py Normal file
View File

@ -0,0 +1,24 @@
# -*- coding: utf-8 -*-
class sphinx_conf:
host_name = "localhost"
port = 9312
index_addjobj = "idx_fias_addrobj"
index_sugg = "idx_fias_sugg"
var_dir = None
class db_conf:
host = None
user = None
password = None
database = None
port = None
class unrar_config:
path = None
class folders:
temp = None

16
aore/config/dev.py Normal file
View File

@ -0,0 +1,16 @@
# -*- coding: utf-8 -*-
from __future__ import absolute_import
from .common import *
sphinx_conf.var_dir = "C:\\Sphinx"
db_conf.database = "postgres"
db_conf.host = "localhost"
db_conf.port = 5432
db_conf.user = "postgres"
db_conf.password = "intercon"
unrar_config.path = "C:\Program Files (x86)\WinRAR\unrar.exe"
folders.temp = "E:\\!TEMP"

View File

@ -1,13 +1,15 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from traceback import format_exc from traceback import format_exc
import psycopg2.extras import psycopg2.extras
class DBImpl: class DBImpl:
def __init__(self, engine, params): def __init__(self, engine, db_config):
self.db_engine = engine self.db_engine = engine
self.connection = engine.connect(**params) self.connection = engine.connect(dbname=db_config.database, user=db_config.user, password=db_config.password,
port=db_config.port, host=db_config.host)
def transaction_commit(self): def transaction_commit(self):
self.connection.commit() self.connection.commit()

View File

@ -4,19 +4,20 @@ from bottle import template
from aore.dbutils.dbimpl import DBImpl from aore.dbutils.dbimpl import DBImpl
from aore.fias.search import SphinxSearch from aore.fias.search import SphinxSearch
from aore.config import db as dbparams from aore.config import db_conf
class FiasFactory: class FiasFactory:
def __init__(self): def __init__(self):
self.db = DBImpl(psycopg2, dbparams) self.db = DBImpl(psycopg2, db_conf)
self.searcher = SphinxSearch(self.db) self.searcher = SphinxSearch(self.db)
self.expand_templ = template('aore/templates/postgre/expand_query.sql', aoid="//aoid") self.expand_templ = template('aore/templates/postgre/expand_query.sql', aoid="//aoid")
self.normalize_templ = template('aore/templates/postgre/normalize_query.sql', aoid="//aoid")
# text - строка поиска # text - строка поиска
# strong - строгий поиск (True) или "мягкий" (False) (с допущением ошибок, опечаток) # strong - строгий поиск (True) или "мягкий" (False) (с допущением ошибок, опечаток)
# out_format - "full" or "simple" - полный (подробно для каждого подпункта) или простой (только строка и AOID) # Строгий используется при импорте из внешних систем (автоматически), где ошибка критична
def find(self, text, strong=False, out_format="simple"): def find(self, text, strong=False):
try: try:
results = self.searcher.find(text, strong) results = self.searcher.find(text, strong)
except Exception, err: except Exception, err:
@ -26,12 +27,26 @@ class FiasFactory:
# Нормализует подаваемый AOID или AOGUID в актуальный AOID # Нормализует подаваемый AOID или AOGUID в актуальный AOID
def normalize(self, aoid_guid): def normalize(self, aoid_guid):
pass try:
sql_query = self.normalize_templ.replace("//aoid", aoid_guid)
rows = self.db.get_rows(sql_query, True)
except Exception, err:
return dict(error=err.args[0])
if len(rows) == 0:
return []
else:
return rows[0]
# Разворачивает AOID в представление (перед этим нормализует) # Разворачивает AOID в представление (перед этим нормализует)
def expand(self, aoid_guid): def expand(self, aoid_guid):
try: try:
sql_query = self.expand_templ.replace("//aoid", aoid_guid) normalized_id = self.normalize(aoid_guid)
if 'aoid' not in normalized_id:
raise BaseException("Invalid AOID or AOGUID")
else:
normalized_id = normalized_id['aoid']
sql_query = self.expand_templ.replace("//aoid", normalized_id)
rows = self.db.get_rows(sql_query, True) rows = self.db.get_rows(sql_query, True)
except Exception, err: except Exception, err:
return dict(error=err.args[0]) return dict(error=err.args[0])

View File

@ -5,7 +5,7 @@ import re
import Levenshtein import Levenshtein
import sphinxapi import sphinxapi
from aore.config import sphinx from aore.config import sphinx_conf
from aore.fias.wordentry import WordEntry from aore.fias.wordentry import WordEntry
from aore.miscutils.trigram import trigram from aore.miscutils.trigram import trigram
@ -26,17 +26,17 @@ class SphinxSearch:
self.db = db self.db = db
self.client_sugg = sphinxapi.SphinxClient() self.client_sugg = sphinxapi.SphinxClient()
self.client_sugg.SetServer(sphinx.host, sphinx.port) self.client_sugg.SetServer(sphinx_conf.host_name, sphinx_conf.port)
self.client_sugg.SetLimits(0, 10) self.client_sugg.SetLimits(0, 10)
self.client_sugg.SetConnectTimeout(3.0) self.client_sugg.SetConnectTimeout(3.0)
self.client_show = sphinxapi.SphinxClient() self.client_show = sphinxapi.SphinxClient()
self.client_show.SetServer(sphinx.host, sphinx.port) self.client_show.SetServer(sphinx_conf.host_name, sphinx_conf.port)
self.client_show.SetLimits(0, 10) self.client_show.SetLimits(0, 10)
self.client_show.SetConnectTimeout(3.0) self.client_show.SetConnectTimeout(3.0)
def __configure(self, index_name, wlen=None): def __configure(self, index_name, wlen=None):
if index_name == sphinx.index_sugg: if index_name == sphinx_conf.index_sugg:
if wlen: if wlen:
self.client_sugg.SetMatchMode(sphinxapi.SPH_MATCH_EXTENDED2) self.client_sugg.SetMatchMode(sphinxapi.SPH_MATCH_EXTENDED2)
self.client_sugg.SetRankingMode(sphinxapi.SPH_RANK_WORDCOUNT) self.client_sugg.SetRankingMode(sphinxapi.SPH_RANK_WORDCOUNT)
@ -52,8 +52,8 @@ class SphinxSearch:
word_len = str(len(word) / 2) word_len = str(len(word) / 2)
trigrammed_word = '"{}"/1'.format(trigram(word)) trigrammed_word = '"{}"/1'.format(trigram(word))
self.__configure(sphinx.index_sugg, word_len) self.__configure(sphinx_conf.index_sugg, word_len)
result = self.client_sugg.Query(trigrammed_word, sphinx.index_sugg) result = self.client_sugg.Query(trigrammed_word, sphinx_conf.index_sugg)
# Если по данному слову не найдено подсказок (а такое бывает?) # Если по данному слову не найдено подсказок (а такое бывает?)
# возвращаем [] # возвращаем []
@ -67,7 +67,7 @@ class SphinxSearch:
outlist = list() outlist = list()
for match in result['matches']: for match in result['matches']:
if len(outlist) >= count: if len(outlist) >= count:
break; break
if maxrank - match['attrs']['krank'] < self.default_rating_delta: if maxrank - match['attrs']['krank'] < self.default_rating_delta:
jaro_rating = Levenshtein.jaro(word, match['attrs']['word']) jaro_rating = Levenshtein.jaro(word, match['attrs']['word'])
@ -117,9 +117,9 @@ class SphinxSearch:
word_entries = self.__get_word_entries(words, strong) word_entries = self.__get_word_entries(words, strong)
sentence = "{}".format(" MAYBE ".join(x.get_variations() for x in word_entries)) sentence = "{}".format(" MAYBE ".join(x.get_variations() for x in word_entries))
self.__configure(sphinx.index_addjobj) self.__configure(sphinx_conf.index_addjobj)
logging.info("QUERY " + sentence) logging.info("QUERY " + sentence)
rs = self.client_show.Query(sentence, sphinx.index_addjobj) rs = self.client_show.Query(sentence, sphinx_conf.index_addjobj)
logging.info("OK") logging.info("OK")
results = [] results = []
@ -128,4 +128,5 @@ class SphinxSearch:
if strong: if strong:
results.sort(key=lambda x: Levenshtein.ratio(text, x['text']), reverse=True) results.sort(key=lambda x: Levenshtein.ratio(text, x['text']), reverse=True)
return results return results

View File

@ -1,6 +1,5 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import re import re
import logging
class WordEntry: class WordEntry:

View File

@ -5,9 +5,9 @@ import os
from bottle import template from bottle import template
from aore.config import folders, db_conf, sphinx_conf
from aore.updater.aoxmltableentry import AoXmlTableEntry from aore.updater.aoxmltableentry import AoXmlTableEntry
from aore.updater.dbhandler import DbHandler from aore.updater.dbhandler import DbHandler
from aore.config import db as dbconfig, sphinx, trashfolder
from trigram import trigram from trigram import trigram
@ -51,15 +51,15 @@ class SphinxHelper:
logging.info("Successfully configured. Please restart searchd.") logging.info("Successfully configured. Please restart searchd.")
def __create_sugg_index_config(self): def __create_sugg_index_config(self):
fname = os.path.abspath(trashfolder + "suggest.conf") fname = os.path.abspath(folders.temp + "/suggest.conf")
logging.info("Creating config {}".format(fname)) logging.info("Creating config {}".format(fname))
conf_data = template('aore/templates/sphinx/idx_suggest.conf', db_host=dbconfig['host'], conf_data = template('aore/templates/sphinx/idx_suggest.conf', db_host=db_conf.host,
db_user=dbconfig['user'], db_user=db_conf.user,
db_password=dbconfig['password'], db_password=db_conf.password,
db_name=dbconfig['database'], db_port=dbconfig['port'], db_name=db_conf.database, db_port=db_conf.port,
index_name=sphinx.index_sugg, index_name=sphinx_conf.index_sugg,
sphinx_var_path=sphinx.var_dir) sphinx_var_path=sphinx_conf.var_dir)
f = open(fname, "w") f = open(fname, "w")
f.write(conf_data) f.write(conf_data)
@ -71,7 +71,7 @@ class SphinxHelper:
def __dbexport_sugg_dict(self): def __dbexport_sugg_dict(self):
logging.info("Place suggestion dict to DB {}...".format(self.files['dict.txt'])) logging.info("Place suggestion dict to DB {}...".format(self.files['dict.txt']))
dict_dat_fname = os.path.abspath(trashfolder + "suggdict.csv") dict_dat_fname = os.path.abspath(folders.temp + "/suggdict.csv")
csv_counter = 0 csv_counter = 0
with open(self.files['dict.txt'], "r") as dict_file, open(dict_dat_fname, "w") as exit_file: with open(self.files['dict.txt'], "r") as dict_file, open(dict_dat_fname, "w") as exit_file:
@ -104,16 +104,16 @@ class SphinxHelper:
logging.info("Done.") logging.info("Done.")
def __create_ao_index_config(self): def __create_ao_index_config(self):
fname = os.path.abspath(trashfolder + "addrobj.conf") fname = os.path.abspath(folders.temp + "/addrobj.conf")
logging.info("Creating config {}".format(fname)) logging.info("Creating config {}".format(fname))
conf_data = template('aore/templates/sphinx/idx_addrobj.conf', db_host=dbconfig['host'], conf_data = template('aore/templates/sphinx/idx_addrobj.conf', db_host=db_conf.host,
db_user=dbconfig['user'], db_user=db_conf.user,
db_password=dbconfig['password'], db_password=db_conf.password,
db_name=dbconfig['database'], db_port=dbconfig['port'], db_name=db_conf.database, db_port=db_conf.port,
sql_query=template('aore/templates/postgre/sphinx_query.sql').replace("\n", " \\\n"), sql_query=template('aore/templates/postgre/sphinx_query.sql').replace("\n", " \\\n"),
index_name=sphinx.index_addjobj, index_name=sphinx_conf.index_addjobj,
sphinx_var_path=sphinx.var_dir) sphinx_var_path=sphinx_conf.var_dir)
f = open(fname, "w") f = open(fname, "w")
f.write(conf_data) f.write(conf_data)
@ -124,11 +124,11 @@ class SphinxHelper:
return fname return fname
def __create_suggestion_dict(self): def __create_suggestion_dict(self):
fname = os.path.abspath(trashfolder + "suggdict.txt") fname = os.path.abspath(folders.temp + "/suggdict.txt")
logging.info("Make suggestion dict ({})...".format(fname)) logging.info("Make suggestion dict ({})...".format(fname))
run_builddict_cmd = "{} {} -c {} --buildstops {} 200000 --buildfreqs".format(self.index_binary, run_builddict_cmd = "{} {} -c {} --buildstops {} 200000 --buildfreqs".format(self.index_binary,
sphinx.index_addjobj, sphinx_conf.index_addjobj,
self.files['addrobj.conf'], fname) self.files['addrobj.conf'], fname)
os.system(run_builddict_cmd) os.system(run_builddict_cmd)
logging.info("Done.") logging.info("Done.")
@ -139,7 +139,7 @@ class SphinxHelper:
out_filename = os.path.abspath(config_fname) out_filename = os.path.abspath(config_fname)
logging.info("Creating main config {}...".format(out_filename)) logging.info("Creating main config {}...".format(out_filename))
conf_data = template('aore/templates/sphinx/sphinx.conf', sphinx_var_path=sphinx.var_dir) conf_data = template('aore/templates/sphinx/sphinx.conf', sphinx_var_path=sphinx_conf.var_dir)
f = open(out_filename, "w") f = open(out_filename, "w")
for fname, fpath in self.files.iteritems(): for fname, fpath in self.files.iteritems():

View File

@ -0,0 +1 @@
SELECT AOID FROM "ADDROBJ" WHERE (AOID='{{ aoid }}' OR AOGUID='{{ aoid }}') AND ACTSTATUS=True AND LIVESTATUS=True AND NEXTID IS NULL LIMIT 1;

View File

@ -1,8 +1,7 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import os import os
from aore.updater.aoxmltableentry import AoXmlTableEntry from aore.config import folders
from aore.config import trashfolder
from aore.dbutils.dbschemas import db_shemas from aore.dbutils.dbschemas import db_shemas
from xmlparser import XMLParser from xmlparser import XMLParser
@ -52,7 +51,7 @@ class AoDataParser:
self.data_bereit_callback = data_callback self.data_bereit_callback = data_callback
self.currentpage = 0 self.currentpage = 0
self.base_filename = \ self.base_filename = \
trashfolder + "fd_" + \ folders.temp + "/fd_" + \
str(self.datasource.operation_type) + "_" + \ str(self.datasource.operation_type) + "_" + \
self.datasource.table_name + ".csv.part{}" self.datasource.table_name + ".csv.part{}"
self.counter = self.pagesize + 1 self.counter = self.pagesize + 1

View File

@ -7,21 +7,22 @@ from traceback import format_exc
import rarfile import rarfile
import requests import requests
from aore.config import unrar, trashfolder from aore.config import folders, unrar_config
from aoxmltableentry import AoXmlTableEntry from aoxmltableentry import AoXmlTableEntry
class AoRar: class AoRar:
def __init__(self): def __init__(self):
rarfile.UNRAR_TOOL = unrar rarfile.UNRAR_TOOL = unrar_config.path
def download(self, url): def download(self, url):
logging.info("Downloading {}".format(url)) logging.info("Downloading {}".format(url))
try: try:
local_filename = os.path.abspath(trashfolder + url.split('/')[-1]) local_filename = os.path.abspath(folders.temp + "/" + url.split('/')[-1])
if os.path.isfile(local_filename): if os.path.isfile(local_filename):
# TODO: UNCOMMENT os.remove(local_filename)
return local_filename return local_filename
os.remove(local_filename)
request = requests.get(url, stream=True) request = requests.get(url, stream=True)
with open(local_filename, 'wb') as f: with open(local_filename, 'wb') as f:

View File

@ -5,15 +5,15 @@ import logging
import psycopg2 import psycopg2
from bottle import template from bottle import template
from aore.updater.aoxmltableentry import AoXmlTableEntry from aore.config import db_conf
from aore.config import db as dbparams
from aore.dbutils.dbimpl import DBImpl from aore.dbutils.dbimpl import DBImpl
from aore.dbutils.dbschemas import db_shemas from aore.dbutils.dbschemas import db_shemas
from aore.updater.aoxmltableentry import AoXmlTableEntry
class DbHandler: class DbHandler:
def __init__(self): def __init__(self):
self.db = DBImpl(psycopg2, dbparams) self.db = DBImpl(psycopg2, db_conf)
def bulk_csv(self, operation_type, table_name, processed_count, csv_file_name): def bulk_csv(self, operation_type, table_name, processed_count, csv_file_name):
sql_query = None sql_query = None

View File

@ -3,12 +3,11 @@
import logging import logging
from os import walk, path from os import walk, path
from aore.dbutils.dbschemas import allowed_tables
from aore.updater.aodataparser import AoDataParser from aore.updater.aodataparser import AoDataParser
from aore.updater.aorar import AoRar from aore.updater.aorar import AoRar
from aore.updater.aoxmltableentry import AoXmlTableEntry from aore.updater.aoxmltableentry import AoXmlTableEntry
from aore.updater.dbhandler import DbHandler from aore.updater.dbhandler import DbHandler
from aore.updater.soapreceiver import SoapReceiver
from aore.dbutils.dbschemas import allowed_tables
class Updater: class Updater:

View File

@ -4,8 +4,8 @@ import optparse
from aore.fias.fiasfactory import FiasFactory from aore.fias.fiasfactory import FiasFactory
from aore.miscutils.sphinx import SphinxHelper from aore.miscutils.sphinx import SphinxHelper
from aore.updater.updater import Updater
from aore.updater.soapreceiver import SoapReceiver from aore.updater.soapreceiver import SoapReceiver
from aore.updater.updater import Updater
def print_fias_versions(): def print_fias_versions():
@ -56,7 +56,7 @@ def get_allowed_updates(updates_str, mode = "create"):
if uv_ver > current_version and (not user_defined_list or uv_ver in user_defined_list): if uv_ver > current_version and (not user_defined_list or uv_ver in user_defined_list):
out_list.append(uv) out_list.append(uv)
out_list.sort(key=lambda x: x['intver']) out_list.sort(key=lambda item: item['intver'])
for ol_entry in out_list: for ol_entry in out_list:
yield ol_entry yield ol_entry
@ -117,9 +117,9 @@ def main():
# 4 Debug purposes.. # 4 Debug purposes..
if options.test: if options.test:
sph = FiasFactory() sph = FiasFactory()
print json.dumps(sph.normalize("463ce8e4-928b-45cc-be76-46c2494632b6"))
print json.dumps(sph.expand("453091f5-2336-4aea-9b90-c4060dca0b33")) print json.dumps(sph.expand("453091f5-2336-4aea-9b90-c4060dca0b33"))
print json.dumps(sph.find('с паспаул ул кедровая', True)) print json.dumps(sph.find('ул кемровая пасраул алтай майминский р'))
print json.dumps(sph.find('с паспаул ул кедровая'))
if __name__ == '__main__': if __name__ == '__main__':