# -*- coding: utf-8 -*- from accounts.models import User from country.models import Country from city.models import City from theme.models import Theme, Tag from hvad.utils import get_translation_aware_manager def get_bool(value): if value: return 1 return 0 def get_int(value): if not value: return '' return value from bitfield import BitHandler from exposition.models import BIT_AUDIENCE def get_audience(value): if isinstance(value, BitHandler): l = [k for k, v in value.iteritems() if v] if l: new_list = [] for value in l: for item1, item2 in BIT_AUDIENCE: if value == item1: new_list.append(item2) return ', '.join(new_list) return def get_theme(value): objects = value.all() return ','.join(str(obj.id) for obj in objects) def get_tag(tag, theme): tags = tag.all() themes = theme.all() result = '' for theme in themes: # list of tags with current theme tag_list = [str(tag.id) for tag in tags if tag.theme == theme] result += '['+','.join(tag_list)+']' return result def get_place_type(): pass field_settings = [ {'name': 'id', 'verbose_name': u'id', 'type': get_int, 'width':1500}, {'name': 'url', 'verbose_name': u'url', 'type': unicode}, {'name': 'name', 'verbose_name': u'Имя', 'type': unicode}, {'name': 'type', 'verbose_name': u'Тип', 'type': get_place_type, 'width':8000}, {'name': 'data_begin', 'verbose_name': u'Дата начала', 'type': unicode}, {'name': 'data_end', 'verbose_name': u'Дата окончания', 'type': unicode}, {'name': 'audience', 'verbose_name': u'Аудитория', 'type': get_audience}, {'name': 'main_title', 'verbose_name': u'Краткое описание', 'type': unicode}, {'name': 'description', 'verbose_name': u'Описание', 'type': unicode}, {'name': 'country', 'verbose_name': u'Страна', 'type': unicode}, {'name': 'city', 'verbose_name': u'Город', 'type': unicode}, {'name': 'theme', 'verbose_name': u'Тематика', 'type': get_theme, 'width':8000}, {'name': 'tag', 'verbose_name': u'Теги', 'type': get_tag, 'width':8000}, {'name': 'address', 'verbose_name': u'Адрес', 'type': unicode}, #{'name': 'periodic', 'verbose_name': 'Периодичность', 'type': str}, {'name': 'web_page', 'verbose_name': u'Веб страница', 'type': unicode}, {'name': 'email', 'verbose_name': u'Email', 'type': unicode}, {'name': 'phone', 'verbose_name': u'Телефон', 'type': get_int}, {'name': 'time', 'verbose_name': u'Время проведения', 'type': unicode}, {'name': 'products', 'verbose_name': u'Экспонируемые продукты', 'type': unicode}, {'name': 'foundation', 'verbose_name': u'Год основания', 'type': get_int}, {'name': 'events_number', 'verbose_name': u'Год основания', 'type': get_int}, {'name': 'staff_number', 'verbose_name': u'Год основания', 'type': get_int}, {'name': 'specialization', 'verbose_name': u'Год основания', 'type': unicode}, {'name': 'foundation_year', 'verbose_name': u'Год основания', 'type': get_int}, {'name': 'tax', 'verbose_name': u'Налог включен', 'type': get_bool, 'width':1000}, {'name': 'currency', 'verbose_name': u'Валюта', 'type': unicode}, {'name': 'max_price', 'verbose_name': u'Максимальная цена', 'type': get_int}, {'name': 'min_price', 'verbose_name': u'Минимальная цена', 'type': get_int}, {'name': 'registration_payment', 'verbose_name': u'Регистрационный взнос', 'type': get_int}, {'name': 'min_closed_area', 'verbose_name': u'Минимальная цена закрытой НЕ оборудованной площади', 'type': get_int}, {'name': 'max_closed_area', 'verbose_name': u'Максимальная цена закрытой НЕ оборудованной площади', 'type': get_int}, {'name': 'min_closed_equipped_area', 'verbose_name': u'Минимальная цена закрытой оборудованной площади ', 'type': get_int}, {'name': 'max_closed_equipped_area', 'verbose_name': u'Максимальная цена закрытой оборудованной площади', 'type': get_int}, {'name': 'min_open_area', 'verbose_name': u'Минимальная цена закрытой площади', 'type': get_int}, {'name': 'max_open_area', 'verbose_name': u'Максимальная цена открытой площади', 'type': get_int}, {'name': 'min_area', 'verbose_name': u'Минимальная площадь', 'type': get_int}, {'name': 'max_area', 'verbose_name': u'Максимальная площадь', 'type': get_int}, {'name': 'is_published', 'verbose_name': u'Опубликована', 'type': get_bool}, {'name': 'canceled_by_administrator', 'verbose_name': u'Отменена администратором', 'type': get_bool} ] def to_int(val): """ Reverse function to get_int return None if value isnt integer """ try: return int(val) except ValueError: return None def to_country(value): try: query = get_translation_aware_manager(Country) country = query.filter(name=value)[0] return country except IndexError: return None def to_city(value, lang, country): try: # get city by name objects = get_translation_aware_manager(City) # except IndexError if no found city = objects.filter(name=value)[0] return city except IndexError: # not found # try to create new city city = City(country=country) city.translate(lang) city.name = value city.save() return city from exposition.models import Exposition def to_audience(value, model=Exposition): if value: l = value.split(', ') if l: new_list = [] for value in l: for item1, item2 in BIT_AUDIENCE: if value == item2: new_list.append(item1) if new_list: return reduce(lambda x,y: x|y, (getattr(model.audience, item) for item in new_list)) return 0 def to_theme(value): if isinstance(value, float): if (value - int(value) > 0): value = str(value) else: value = str(int(value)) theme_ids = value.split('.') else: theme_ids = value.split(',') theme_objects = [] for id in theme_ids: try: theme = Theme.objects.language().get(id=int(id)) theme_objects.append(theme) except Theme.DoesNotExist, ValueError: pass return theme_objects def to_tag(value, lang, themes): if value == [""]: return None value = value.replace('[', '') themes = themes.all() # list tags by themes value = value.split(']') arr = [] for theme_number, theme in enumerate(themes): for val in value[theme_number].split(','): if val: try: tag = Tag.objects.language(lang).get(id=int(val), theme=theme) arr.append(tag) except Tag.DoesNotExist, ValueError: pass return arr def to_theme_type(st): if not st: return 15 types = st.split(',') flag = 0 flag = reduce(lambda x,y: x|y, (getattr(Theme.types, item) for item in types)) return flag import time, xlrd def to_date(value): if isinstance(value, unicode): t = time.strptime(value, "%d.%m.%Y") if isinstance(value, float): t = xlrd.xldate_as_tuple(value, 0)+(0,0,0) return time.strftime("%Y-%m-%d", t) import_settings={ 'name': {'func': unicode, }, 'url': {'func': unicode}, 'data_begin': {'func': to_date}, 'data_end': {'func': to_date}, 'main_title': {'func': unicode}, 'description': {'func': unicode}, 'audience': {'func': to_audience}, 'country': {'func': to_country}, 'city': {'func': to_city, 'extra_values': 'country'}, 'theme': {'func': to_theme}, 'tag': {'func': to_tag, 'extra_values': 'theme'}, 'periodic': {'func': unicode}, 'web_page': {'func': unicode}, 'time': {'func': unicode}, 'products': {'func': unicode}, 'foundation_year': {'func': to_int}, 'tax': {'func': bool}, 'currency': {'func': unicode}, 'max_price': {'func': to_int}, 'min_price': {'func': to_int}, 'registration_payment': {'func': to_int}, 'min_closed_area': {'func': to_int}, 'max_closed_area': {'func': to_int}, 'min_closed_equipped_area': {'func': to_int}, 'max_closed)equipped_area': {'func': to_int}, 'min_open_area': {'func': to_int}, 'max_open_area': {'func': to_int}, 'min_area': {'func': to_int}, 'max_area': {'func': to_int}, 'is_published': {'func': bool}, 'canceled_by_administrator': {'func': bool}, 'types': {'func': to_theme_type} }