Exemplo n.º 1
0
    def test_register_user_failed(self):
        usr = UserModel(
            username=self.first_user.username,
            password=self.first_user.password,
            email=self.first_user.email
        )
        response_body = UserApi.register_user(usr).json()
        self.check_error(response_body, 'Username {} already exist'.format(usr.username))

        usr.username = random_string(7)
        response_body = UserApi.register_user(usr).json()
        self.check_error(response_body, 'Email {} already exist'.format(usr.email.lower()))

        usr.email = random_string(7)
        response_body = UserApi.register_user(usr).json()
        self.check_error(response_body, 'Not valid email')

        usr.email = "{}@{}.{}".format(random_string(7), random_string(3), random_string(2))
        usr.username = random_string(6)
        response_body = UserApi.register_user(usr).json()
        self.check_error(response_body, "Username must be greater than 6 characters")

        usr.username = random_string(7)
        usr.password = random_string(6)
        response_body = UserApi.register_user(usr).json()
        self.check_error(response_body, "Password must be greater than 6 characters")
Exemplo n.º 2
0
    def test_users_login(self):
        response_body = UserApi.login_user(self.first_user).json()
        self.check_user_view_model(self.first_user, response_body)
        self.first_user.token = response_body.get('token')

        response_body = UserApi.login_user(self.second_user).json()
        self.check_user_view_model(self.second_user, response_body)
        self.second_user.token = response_body.get('token')
Exemplo n.º 3
0
    def test_curr_user(self):
        response = UserApi.current_user(self.first_user.token).json()
        self.check_user_view_model(self.first_user, response)
        self.first_user.token = response.get('token')

        response = UserApi.current_user(self.second_user.token).json()
        self.check_user_view_model(self.second_user, response)
        self.second_user.token = response.get('token')
Exemplo n.º 4
0
    def test_register_users(self):
        response_body = UserApi.register_user(self.first_user).json()
        self.check_user_register_success(self.first_user, response_body)
        self.first_user.token = response_body.get('token')
        self.first_user.id = response_body.get('user').get('id')

        response_body = UserApi.register_user(self.second_user).json()
        self.check_user_register_success(self.second_user, response_body)
        self.second_user.token = response_body.get('token')
        self.second_user.id = response_body.get('user').get('id')
Exemplo n.º 5
0
 def test_login_failed(self):
     usr = UserModel(
         username = self.first_user.username,
         password = random_string(7)
     )
     response_body = UserApi.login_user(usr).json()
     self.check_error(response_body, "Login failed")
Exemplo n.º 6
0
    def __init__(self):
        self.user_storage = {}
        self.api = UserApi('http://urbanalerts.ml', 'alice')
        self.request = None
        self.response = None
        self.tags = {
            "Урбанистика": "Urban",
            "Общество": "Social",
            "Экология": "Eco"
        }
        self.meanings = {"новое": "new_problem", "проблемы": "get_problems"}

        self.conversations = {
            "new_problem": {
                0: self.get_title,
                1: self.get_description,
                2: self.get_address,
                3: self.get_tag
            },
            "new_": {}
        }
Exemplo n.º 7
0
class AliceDialog:
    def __init__(self):
        self.user_storage = {}
        self.api = UserApi('http://urbanalerts.ml', 'alice')
        self.request = None
        self.response = None
        self.tags = {
            "Урбанистика": "Urban",
            "Общество": "Social",
            "Экология": "Eco"
        }
        self.meanings = {"новое": "new_problem", "проблемы": "get_problems"}

        self.conversations = {
            "new_problem": {
                0: self.get_title,
                1: self.get_description,
                2: self.get_address,
                3: self.get_tag
            },
            "new_": {}
        }

    # Анализ сообщений для соотнесения с ключевыми словами
    def parse_message(self, message: str):
        message = message.split()[0].lower()  # TODO обработку сообщений
        if message in list(self.meanings.keys()):
            meaning = self.meanings[message]
        else:
            meaning = "unclassed"
        return meaning

    # Выполнение на основании ключевых слов
    def execute(self, meaning: str):
        message = ""
        # if meaning == "profile":
        # response = self.api.user_profile(self.request.user_id, "alice")
        # pass
        # if response.status:
        #     self.response.set_text(f"{response.text}")
        if meaning == "new_problem":
            message = 'Если хотите прервать действие скажите/введите "Отмена". "Дайте название проблеме.'
            self.user_storage["conversation"] = "new_problem"

        elif meaning == "get_problems":
            self.get_problems()

        # elif meaning == "stats":
        #     pass
        # elif meaning == "comments/add":
        #     pass
        # elif meaning == "problems/solved":
        #     pass
        # elif meaning == "problems/all":
        #     pass
        # elif meaning == "problems/active":
        #     pass
        if meaning == "unclassed":
            self.response.set_text(
                f"Введите/скажите что-нибудь из списка: {', '.join(self.meanings)}"
            )
        else:
            self.response.set_text(message)

    # Сброс диалоговых переменных
    def reset_conversation(self):
        self.user_storage["conversation"] = None
        self.user_storage["state"] = 0
        self.user_storage["content"] = []
        self.user_storage["buttons_mode"] = False

    # Функции для ConvHandler new
    # ==================================================================================================================
    def get_title(self):
        self.user_storage["state"] += 1
        self.user_storage["content"].append(self.request.command)
        self.response.set_text("Дайте описание проблемы.")

    def get_description(self):
        self.user_storage["state"] += 1
        self.user_storage["content"].append(self.request.command)
        self.response.set_text("Назовите адрес места с этой проблемой.")

    def get_address(self):
        self.user_storage["state"] += 1
        self.user_storage["content"].append(self.request.command)
        self.response.set_text(
            f"Выберите один тег, подходящий для вашей проблемы, нажав на кнопку."
        )
        buttons = []
        for button in self.tags.keys():
            buttons.append({
                "title": button,
                "payload": {
                    "pressed": True,
                    "button": self.tags[button]
                },
                "hide": True
            })
        self.user_storage["buttons_mode"] = True
        self.response.set_buttons(buttons)

    def get_tag(self):
        tag = self.request.payload["button"]
        title, description, address = self.user_storage[
            "content"]  # tag уже присутствует как локальная переменная
        response = self.api.problem_new(title, description, tag, address)

        logger.info(response)
        self.response.set_text("Успешно отмечено.")
        self.reset_conversation()

    # Функции для ConvHandler get problems
    # ==================================================================================================================
    def get_problems(self):
        response = json.loads(self.api.get_problems().text)
        result = ""
        lenght = len(response)
        if len(response) > 5:
            lenght = 5
        for i in range(lenght):
            result += f"{i+1} {response[i]['title']} {response[i]['description']} {response[i]['coors']}| "
        self.response.set_text(
            f"На данный момент актуальны следующие проблемы: {result}")

    # ==================================================================================================================

    # Основной обработчик
    def handle_dialog(
        self, request: AliceRequest
    ) -> AliceResponse:  # alice_request, alice_response, session_storage
        self.request = request
        logger.info(request)
        self.response = AliceResponse(self.request)  # Создаем тело ответа

        if self.request.is_new_session:
            self.user_storage["conversation"] = None
            self.user_storage["state"] = 0
            self.user_storage["content"] = []
            self.user_storage["buttons_mode"] = False
            self.response.set_text(
                'Этот навык позволит вам оперативно опубликовывать '
                'экологические проблемы города, а также получать информацию по ним. '
                'Чтобы опубликовать проблему, скажите или введите "Новое", '
                'чтобы получить объявления - "Проблемы".')
            return self.response

        if self.user_storage["conversation"] is None:
            message = self.request.command.lower().strip()  # .replace()
            # Предобработка message
            meaning = self.parse_message(message)
            self.execute(meaning)
        elif not self.user_storage["buttons_mode"]:
            if self.request.command.lower().strip() == "отмена":
                self.reset_conversation()
                self.response.set_text("Действие отменено")
            else:
                input_functions = self.user_storage["conversation"]
                state = self.user_storage["state"]
                self.conversations[input_functions][state](
                )  # Запускаем функцию из очереди
        else:
            input_functions = self.user_storage["conversation"]
            state = self.user_storage["state"]
            self.conversations[input_functions][state](
            )  # Запускаем функцию из очереди

        return self.response
Exemplo n.º 8
0
 def test_invalid_token(self):
     response = UserApi.current_user(random_string(16))
     self.check_error(response.json(), "Invalid token")
Exemplo n.º 9
0
    2. Add a URL to urlpatterns:  url(r'^$', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.conf.urls import url, include
    2. Add a URL to urlpatterns:  url(r'^blog/', include('blog.urls'))
"""
from django.conf.urls import url
from django.conf.urls import include
from django.contrib import admin
import views
import settings
from django.conf.urls.static import static
from tastypie.api import Api
from api import UserApi, BarCodeApi, SendToShopApi, ProductApi, InvoiceApi, ProductToShopApi, ShopApi

v1_api = Api(api_name='v1')
v1_api.register(UserApi())
v1_api.register(BarCodeApi())
v1_api.register(SendToShopApi())
v1_api.register(ProductApi())
v1_api.register(InvoiceApi())
v1_api.register(ShopApi())
v1_api.register(ProductToShopApi())

urlpatterns = []

urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
urlpatterns += [
    url(r'^api/', include(v1_api.urls)),
    url(r'^admin/', admin.site.urls),
    url(r'^auth/', include('loginsys.urls')),
    url(r'^invoices/', views.invoices),
Exemplo n.º 10
0
 def __init__(self):
     self.users_data = {}
     self.user_api = UserApi('http://urbanalerts.ml', 'vk')
Exemplo n.º 11
0
class BotMethods:
    def __init__(self):
        self.users_data = {}
        self.user_api = UserApi('http://urbanalerts.ml', 'vk')


    def start(self, bot: VkGroupBot, update: Update):
        if update.message == '!':
            bot.reply('Restarting dialog', remove_keyboard=True)
            return ConvIds.start

        user_id = update.from_id
        self.users_data[user_id] = {'state': ''}

        if bot.last_keyb is not None:
            row, col = bot.last_keyb.was_pressed(update.message)
            if row != -1:
                bot.reply(Replies.main_menu, keyboard=Keyb.menu)
                return ConvIds.main

        bot.reply(Replies.start_on, keyboard=Keyb.start)
        return ConvIds.start


    def main_menu(self, bot: VkGroupBot, update: Update):
        user_id = update.from_id
        self.users_data[user_id] = {'state': ''}

        row, col = Keyb.menu.was_pressed(update.message)

        if (row, col) == (0, 0):
            return self.new_problem(bot, update)
        elif (row, col) == (0, 1):
            return self.account(bot, update)
        elif (row, col) == (1, 0):
            bot.reply(Replies.menu_help)
        elif (row, col) == (2, 0):
            bot.reply(Replies.menu_about)
        else:
            bot.reply(Replies.press_keyb)

        return ConvIds.main


    def new_problem(self, bot: VkGroupBot, update: Update):
        user_id = update.from_id

        if self.users_data[user_id].get('data') is None:
            self.users_data[user_id] = {'state': 'title',
                                        'data':  {'title':    '',
                                                  'photo':    '',
                                                  'photo_id': '',
                                                  'descr':    '',
                                                  'coord':    '',
                                                  'tag':      ''}}
            bot.reply(Replies.newprob_title, remove_keyboard=True)
            return ConvIds.new_problem

        state = self.users_data[user_id]['state']

        if state == 'title':
            self.users_data[user_id]['data']['title'] = update.message
            bot.reply(Replies.newprob_photo, keyboard=Keyb.skip)
            state = 'photo'

        elif state == 'photo':
            if len(update.attachments) == 0:
                row, col = bot.last_keyb.was_pressed(update.message)
                if row == -1:
                    bot.reply(Replies.newprob_photo_too_many)
                    return ConvIds.new_problem
                self.users_data[user_id]['data']['photo'] = ''
            elif len(update.attachments) == 1:
                if update.attachments[0]['type'] == 'photo':
                    photo = update.attachments[0]['photo']
                    biggest_photo = sorted(photo['sizes'], key=lambda x: -x['width'])[0]['url']
                    self.users_data[user_id]['data']['photo'] = biggest_photo
                    # photo_id = f'photo{photo["owner_id"]}_{photo["id"]}_{photo["access_key"]}'
                    photo_id = update.id
                    self.users_data[user_id]['data']['photo_id'] = photo_id
                else:
                    bot.reply(Replies.newprob_photo_too_many)
                    return ConvIds.new_problem
            else:
                bot.reply(Replies.newprob_photo_too_many)
                return ConvIds.new_problem

            bot.reply(Replies.newprob_descr, remove_keyboard=True)
            state = 'descr'

        elif state == 'descr':
            self.users_data[user_id]['data']['descr'] = update.message
            bot.reply(Replies.newprob_coord, keyboard=Keyb.coords)
            state = 'coord'

        elif state == 'coord':
            row, col = bot.last_keyb.was_pressed(update.message)
            if (row, col) == (0, 0):
                bot.reply(Replies.newprob_coord_help)
            else:
                if update.geo:
                    self.users_data[user_id]['data']['coord'] = (update.geo_latitude, update.geo_longitude)
                    bot.reply(Replies.newprob_settg, keyboard=Keyb.tags)
                    state = 'tag'
                else:
                    bot.reply(Replies.newprob_coord)

        elif state == 'tag':
            if bot.last_keyb:
                row, col = bot.last_keyb.was_pressed(update.message)
                if row in [0, 1]:
                    self.users_data[user_id]['data']['tag'] = bot.last_keyb.button_rows[row][col][0]

                    problem_data = self.users_data[user_id]['data']
                    problem_str = Replies.newprob_apply.format(problem_data["title"], problem_data["descr"])
                    if problem_data['photo'] != '':
                        bot.reply(problem_str, forward_messages=[self.users_data[user_id]['data']['photo_id']],
                                  keyboard=Keyb.apply)
                    else:
                        problem_str += ' Не загружена'
                        bot.reply(problem_str, keyboard=Keyb.apply)
                    state = 'apply'
                elif (row, col) == (2, 0):
                    bot.reply(Replies.newprob_settg_help)
                    return ConvIds.new_problem
                else:
                    bot.reply(Replies.press_keyb)

        elif state == 'apply':
            row, col = bot.last_keyb.was_pressed(update.message)
            if (row, col) == (0, 0):
                # bot.reply(Replies.newprob_final_sending)
                data = self.users_data[user_id]['data']
                # = API REQUEST = #
                tag_transformed = {'Экология':            'Eco',
                                   'Урбанистика':         'Urban',
                                   'Социальные проблемы': 'Social'}[data['tag']]

                self.user_api.problem_new(token='tg:123',
                                          title=data['title'],
                                          photo=data['photo'],
                                          description=data['descr'],
                                          tag=tag_transformed,
                                          latitude=data['coord'][0],
                                          longitude=data['coord'][1])
                # = =========== = #
                bot.reply(Replies.newprob_final_ok, keyboard=Keyb.menu)
                return ConvIds.main
            elif (row, col) == (0, 1):
                bot.reply(Replies.newprob_final_canceld, keyboard=Keyb.menu)
                return ConvIds.main
            else:
                bot.reply(Replies.press_keyb)

        self.users_data[user_id]['state'] = state
        return ConvIds.new_problem


    def account(self, bot: VkGroupBot, update: Update):
        user_id = update.from_id

        if self.users_data[user_id]['state'] == '':
            self.users_data[user_id]['state'] = 'account'
            bot.reply(Replies.account_main, keyboard=Keyb.account_main)
            return ConvIds.account

        state = self.users_data[user_id]['state']

        if state == 'account':
            row, col = bot.last_keyb.was_pressed(update.message)
            if (row, col) == (0, 0):
                state = 'sign up'
                bot.reply(Replies.account_regr, keyboard=Keyb.back)
            elif (row, col) == (0, 1):
                state = 'sign in'
                bot.reply(Replies.account_auth, keyboard=Keyb.back)
            elif (row, col) == (1, 0):
                bot.reply(Replies.back_main_menu, keyboard=Keyb.menu)
                return ConvIds.main
            else:
                bot.reply(Replies.press_keyb)

        elif state == 'sign in':
            bot.reply(Replies.account_sign_in, keyboard=Keyb.account_main)
            state = 'account'

        elif state == 'sign up':
            bot.reply(Replies.account_sign_in, keyboard=Keyb.account_main)
            state = 'account'

        self.users_data[user_id]['state'] = state
        return ConvIds.account