diff --git a/microbot/migrations/0018_auto_20160405_0621.py b/microbot/migrations/0018_auto_20160405_0621.py new file mode 100644 index 0000000..cc5d3fd --- /dev/null +++ b/microbot/migrations/0018_auto_20160405_0621.py @@ -0,0 +1,198 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.4 on 2016-04-05 11:21 +from __future__ import unicode_literals + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import microbot.validators + + +class Migration(migrations.Migration): + + dependencies = [ + ('microbot', '0017_auto_20160404_0543'), + ] + + operations = [ + migrations.AlterField( + model_name='bot', + name='enabled', + field=models.BooleanField(default=True, help_text='Enable/disable bot', verbose_name='Enable'), + ), + migrations.AlterField( + model_name='bot', + name='owner', + field=models.ForeignKey(help_text='User who owns the bot', on_delete=django.db.models.deletion.CASCADE, related_name='bots', to=settings.AUTH_USER_MODEL), + ), + migrations.AlterField( + model_name='bot', + name='token', + field=models.CharField(db_index=True, help_text='Token provided by Telegram API https://core.telegram.org/bots', max_length=100, validators=[microbot.validators.validate_token], verbose_name='Token'), + ), + migrations.AlterField( + model_name='bot', + name='user_api', + field=models.OneToOneField(blank=True, help_text='Telegram API info. Automatically retrieved from Telegram', null=True, on_delete=django.db.models.deletion.CASCADE, related_name='bot', to='microbot.User', verbose_name='Bot User'), + ), + migrations.AlterField( + model_name='chatstate', + name='chat', + field=models.OneToOneField(help_text='Chat in Telegram API format. https://core.telegram.org/bots/api#chat', on_delete=django.db.models.deletion.CASCADE, to='microbot.Chat', verbose_name='Chat'), + ), + migrations.AlterField( + model_name='chatstate', + name='state', + field=models.ForeignKey(help_text='State related to the chat', on_delete=django.db.models.deletion.CASCADE, related_name='chat', to='microbot.State', verbose_name='State'), + ), + migrations.AlterField( + model_name='environmentvar', + name='key', + field=models.CharField(help_text='Name of the variable', max_length=255, verbose_name='Key'), + ), + migrations.AlterField( + model_name='environmentvar', + name='value', + field=models.CharField(help_text='Value of the variable', max_length=255, verbose_name='Value'), + ), + migrations.AlterField( + model_name='handler', + name='bot', + field=models.ForeignKey(help_text='Bot which Handler is attached to', on_delete=django.db.models.deletion.CASCADE, related_name='handlers', to='microbot.Bot', verbose_name='Bot'), + ), + migrations.AlterField( + model_name='handler', + name='enabled', + field=models.BooleanField(default=True, help_text='Enable/disable handler', verbose_name='Enable'), + ), + migrations.AlterField( + model_name='handler', + name='name', + field=models.CharField(db_index=True, help_text='Name for the handler', max_length=100, verbose_name='Name'), + ), + migrations.AlterField( + model_name='handler', + name='pattern', + field=models.CharField(help_text='Regular expression the Handler will be triggered. \n Using https://docs.python.org/2/library/re.html#regular-expression-syntax', max_length=255, validators=[microbot.validators.validate_pattern], verbose_name='Pattern'), + ), + migrations.AlterField( + model_name='handler', + name='priority', + field=models.IntegerField(default=0, help_text='Set priority execution. Higher value higher priority', verbose_name='Priority'), + ), + migrations.AlterField( + model_name='handler', + name='request', + field=models.OneToOneField(blank=True, help_text='Request the Handler processes', null=True, on_delete=django.db.models.deletion.SET_NULL, to='microbot.Request'), + ), + migrations.AlterField( + model_name='handler', + name='response', + field=models.OneToOneField(help_text='Template the handler uses to generate response', on_delete=django.db.models.deletion.CASCADE, to='microbot.Response'), + ), + migrations.AlterField( + model_name='handler', + name='source_states', + field=models.ManyToManyField(blank=True, help_text='Bot states the Handler needs to be to execute. Set none if any', related_name='source_handlers', to='microbot.State', verbose_name='Source States'), + ), + migrations.AlterField( + model_name='handler', + name='target_state', + field=models.ForeignKey(blank=True, help_text='This state will be set when handler ends processing', null=True, on_delete=django.db.models.deletion.CASCADE, related_name='target_handlers', to='microbot.State', verbose_name='Target State'), + ), + migrations.AlterField( + model_name='headerparam', + name='key', + field=models.CharField(help_text='Name of the parameter', max_length=255, verbose_name='Key'), + ), + migrations.AlterField( + model_name='headerparam', + name='request', + field=models.ForeignKey(help_text='Request which this Url Parameter is attached to', on_delete=django.db.models.deletion.CASCADE, related_name='header_parameters', to='microbot.Request', verbose_name='Request'), + ), + migrations.AlterField( + model_name='headerparam', + name='value_template', + field=models.CharField(help_text='Value template of the parameter. In jinja2 format. http://jinja.pocoo.org/', max_length=255, validators=[microbot.validators.validate_template], verbose_name='Value template'), + ), + migrations.AlterField( + model_name='hook', + name='bot', + field=models.ForeignKey(help_text='Bot which Hook is attached', on_delete=django.db.models.deletion.CASCADE, related_name='hooks', to='microbot.Bot', verbose_name='Bot'), + ), + migrations.AlterField( + model_name='hook', + name='enabled', + field=models.BooleanField(default=True, help_text=b'Enable/disable hook', verbose_name='Enable'), + ), + migrations.AlterField( + model_name='hook', + name='key', + field=models.CharField(db_index=True, editable=False, help_text='Key generated to complete the Hook url. http://permabots.com/process/hook/{{key}}', max_length=30, unique=True), + ), + migrations.AlterField( + model_name='hook', + name='name', + field=models.CharField(db_index=True, help_text='Name of the hook', max_length=100, verbose_name='Name'), + ), + migrations.AlterField( + model_name='hook', + name='response', + field=models.OneToOneField(help_text='Template the hook uses to generate the response', on_delete=django.db.models.deletion.CASCADE, to='microbot.Response', verbose_name='Response'), + ), + migrations.AlterField( + model_name='recipient', + name='chat_id', + field=models.BigIntegerField(db_index=True, help_text='Chat identifier provided by Telegram API', verbose_name='Chat id'), + ), + migrations.AlterField( + model_name='recipient', + name='hook', + field=models.ForeignKey(help_text='Hook which recipient is attached to', on_delete=django.db.models.deletion.CASCADE, related_name='recipients', to='microbot.Hook', verbose_name='Recipient'), + ), + migrations.AlterField( + model_name='recipient', + name='name', + field=models.CharField(db_index=True, help_text='Name of recipient', max_length=100, verbose_name='Name'), + ), + migrations.AlterField( + model_name='request', + name='url_template', + field=models.CharField(help_text='Url to request. A jinja2 template. http://jinja.pocoo.org/', max_length=255, validators=[microbot.validators.validate_template], verbose_name='Url template'), + ), + migrations.AlterField( + model_name='response', + name='keyboard_template', + field=models.TextField(blank=True, help_text='Template to generate keyboard response. In jinja2 format. http://jinja.pocoo.org/', null=True, validators=[microbot.validators.validate_template, microbot.validators.validate_telegram_keyboard], verbose_name='Keyboard template'), + ), + migrations.AlterField( + model_name='response', + name='text_template', + field=models.TextField(help_text='Template to generate text response. In jinja2 format. http://jinja.pocoo.org/', validators=[microbot.validators.validate_template, microbot.validators.validate_telegram_text_html], verbose_name='Text template'), + ), + migrations.AlterField( + model_name='state', + name='bot', + field=models.ForeignKey(help_text='Bot which state is attached to', on_delete=django.db.models.deletion.CASCADE, related_name='states', to='microbot.Bot', verbose_name='Bot'), + ), + migrations.AlterField( + model_name='state', + name='name', + field=models.CharField(db_index=True, help_text='Name of the state', max_length=255, verbose_name='State name'), + ), + migrations.AlterField( + model_name='urlparam', + name='key', + field=models.CharField(help_text='Name of the parameter', max_length=255, verbose_name='Key'), + ), + migrations.AlterField( + model_name='urlparam', + name='request', + field=models.ForeignKey(help_text='Request which this Url Parameter is attached to', on_delete=django.db.models.deletion.CASCADE, related_name='url_parameters', to='microbot.Request', verbose_name='Request'), + ), + migrations.AlterField( + model_name='urlparam', + name='value_template', + field=models.CharField(help_text='Value template of the parameter. In jinja2 format. http://jinja.pocoo.org/', max_length=255, validators=[microbot.validators.validate_template], verbose_name='Value template'), + ), + ] diff --git a/microbot/models/bot.py b/microbot/models/bot.py index 35dcc31..ba66f36 100644 --- a/microbot/models/bot.py +++ b/microbot/models/bot.py @@ -28,13 +28,13 @@ def validate_token(value): @python_2_unicode_compatible class Bot(MicrobotModel): - owner = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='bots', help_text=_("User who owns the bot.")) + owner = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='bots', help_text=_("User who owns the bot")) token = models.CharField(_('Token'), max_length=100, db_index=True, validators=[validators.validate_token], - help_text=_("Set token provided by Telegram API.")) + help_text=_("Token provided by Telegram API https://core.telegram.org/bots")) user_api = models.OneToOneField(User, verbose_name=_("Bot User"), related_name='bot', on_delete=models.CASCADE, blank=True, null=True, - help_text=_("Telegram API info. Automatically retrieved from Telegram.")) - enabled = models.BooleanField(_('Enable'), default=True, help_text=_("enable/disable bot wehbook.")) + help_text=_("Telegram API info. Automatically retrieved from Telegram")) + enabled = models.BooleanField(_('Enable'), default=True, help_text=_("Enable/disable bot")) class Meta: verbose_name = _('Bot') diff --git a/microbot/models/environment_vars.py b/microbot/models/environment_vars.py index 89d2acc..eb2c3f0 100644 --- a/microbot/models/environment_vars.py +++ b/microbot/models/environment_vars.py @@ -11,8 +11,8 @@ @python_2_unicode_compatible class EnvironmentVar(MicrobotModel): bot = models.ForeignKey(Bot, verbose_name=_('Bot'), related_name="env_vars", help_text=_("Bot which variable is attached.")) - key = models.CharField(_('Key'), max_length=255, help_text=_("Set the name of the variable")) - value = models.CharField(_('Value'), max_length=255, help_text=_("Set the value of the variable")) + key = models.CharField(_('Key'), max_length=255, help_text=_("Name of the variable")) + value = models.CharField(_('Value'), max_length=255, help_text=_("Value of the variable")) class Meta: verbose_name = _('Environment Var') diff --git a/microbot/models/handler.py b/microbot/models/handler.py index 56ff7d6..ab8e838 100644 --- a/microbot/models/handler.py +++ b/microbot/models/handler.py @@ -15,9 +15,9 @@ class AbstractParam(MicrobotModel): - key = models.CharField(_('Key'), max_length=255, help_text=_("Set the name of the parameter")) + key = models.CharField(_('Key'), max_length=255, help_text=_("Name of the parameter")) value_template = models.CharField(_('Value template'), max_length=255, validators=[validators.validate_template], - help_text=_("Set the value of the parameter. A jinja2 template.")) + help_text=_("Value template of the parameter. In jinja2 format. http://jinja.pocoo.org/")) class Meta: abstract = True @@ -34,7 +34,7 @@ def process(self, **context): @python_2_unicode_compatible class Request(MicrobotModel): url_template = models.CharField(_('Url template'), max_length=255, validators=[validators.validate_template], - help_text=_("Set the url to request. A jinja2 template.")) + help_text=_("Url to request. A jinja2 template. http://jinja.pocoo.org/")) GET, POST, PUT, PATCH, DELETE = ("Get", "Post", "Put", "Patch", "Delete") METHOD_CHOICES = ( (GET, _("Get")), @@ -100,7 +100,7 @@ def process(self, **context): class UrlParam(AbstractParam): request = models.ForeignKey(Request, verbose_name=_('Request'), related_name="url_parameters", - help_text=_("Request which this Url Parameter is attached to.")) + help_text=_("Request which this Url Parameter is attached to")) class Meta: verbose_name = _("Url Parameter") @@ -108,7 +108,7 @@ class Meta: class HeaderParam(AbstractParam): request = models.ForeignKey(Request, verbose_name=_('Request'), related_name="header_parameters", - help_text=_("Request which this Url Parameter is attached to.")) + help_text=_("Request which this Url Parameter is attached to")) class Meta: verbose_name = _("Header Parameter") @@ -117,20 +117,21 @@ class Meta: @python_2_unicode_compatible class Handler(MicrobotModel): bot = models.ForeignKey(Bot, verbose_name=_('Bot'), related_name="handlers", - help_text=_("Bot which Handler is attached to.")) - name = models.CharField(_('Name'), max_length=100, db_index=True, help_text=_("Set a name for the handler which helps you to remember it.")) + help_text=_("Bot which Handler is attached to")) + name = models.CharField(_('Name'), max_length=100, db_index=True, help_text=_("Name for the handler")) pattern = models.CharField(_('Pattern'), max_length=255, validators=[validators.validate_pattern], - help_text=_("Regular expression the Handler will be triggered.")) - request = models.OneToOneField(Request, null=True, blank=True, help_text=_("Request the Handler processes."), + help_text=_("""Regular expression the Handler will be triggered. + Using https://docs.python.org/2/library/re.html#regular-expression-syntax""")) + request = models.OneToOneField(Request, null=True, blank=True, help_text=_("Request the Handler processes"), on_delete=models.SET_NULL) - response = models.OneToOneField(Response, help_text=_("Set how Handler responses.")) - enabled = models.BooleanField(_('Enable'), default=True, help_text=_("enable/disable Handler.")) + response = models.OneToOneField(Response, help_text=_("Template the handler uses to generate response")) + enabled = models.BooleanField(_('Enable'), default=True, help_text=_("Enable/disable handler")) source_states = models.ManyToManyField('State', verbose_name=_('Source States'), related_name='source_handlers', blank=True, - help_text=_("Bot states the Handler executes. Set none if any.")) + help_text=_("Bot states the Handler needs to be to execute. Set none if any")) target_state = models.ForeignKey('State', verbose_name=_('Target State'), related_name='target_handlers', null=True, blank=True, - help_text=_("Bot state it is set when Handler finishes.")) + help_text=_("This state will be set when handler ends processing")) priority = models.IntegerField(_('Priority'), default=0, - help_text=_("Set priority execution. Higher value higher priority.")) + help_text=_("Set priority execution. Higher value higher priority")) class Meta: verbose_name = _('Handler') diff --git a/microbot/models/hook.py b/microbot/models/hook.py index ebb2999..aef6085 100644 --- a/microbot/models/hook.py +++ b/microbot/models/hook.py @@ -15,14 +15,14 @@ @python_2_unicode_compatible class Hook(MicrobotModel): bot = models.ForeignKey(Bot, verbose_name=_('Bot'), related_name="hooks", - help_text=_("Bot which Hook is attached.")) + help_text=_("Bot which Hook is attached")) name = models.CharField(_('Name'), max_length=100, db_index=True, - help_text=_("Set a name for the hook which helps you to remember.")) + help_text=_("Name of the hook")) key = models.CharField(max_length=30, db_index=True, editable=False, unique=True, - help_text=_("Key generated to complete the Hoom url.")) + help_text=_("Key generated to complete the Hook url. http://permabots.com/process/hook/{{key}}")) response = models.OneToOneField(Response, verbose_name=_('Response'), - help_text=_("Set how Hook responses.")) - enabled = models.BooleanField(_('Enable'), default=True, help_text="enable/disbale Hook.") + help_text=_("Template the hook uses to generate the response")) + enabled = models.BooleanField(_('Enable'), default=True, help_text="Enable/disable hook") class Meta: verbose_name = _('Hook') @@ -50,10 +50,10 @@ def set_key(sender, instance, **kwargs): @python_2_unicode_compatible class Recipient(MicrobotModel): - chat_id = models.BigIntegerField(_('Chat id'), db_index=True, help_text=_("Chat identifier provided by Telegram API.")) - name = models.CharField(_('Name'), max_length=100, db_index=True, help_text=_("Set name for recipient which helps you to remember it.")) + chat_id = models.BigIntegerField(_('Chat id'), db_index=True, help_text=_("Chat identifier provided by Telegram API")) + name = models.CharField(_('Name'), max_length=100, db_index=True, help_text=_("Name of recipient")) hook = models.ForeignKey(Hook, verbose_name=_('Recipient'), related_name="recipients", - help_text=_("Hook which recipient is attached to.")) + help_text=_("Hook which recipient is attached to")) class Meta: verbose_name = _('Recipient') diff --git a/microbot/models/response.py b/microbot/models/response.py index 0a538da..9c44282 100644 --- a/microbot/models/response.py +++ b/microbot/models/response.py @@ -13,10 +13,10 @@ class Response(MicrobotModel): text_template = models.TextField(verbose_name=_("Text template"), validators=[validators.validate_template, validators.validate_telegram_text_html], - help_text=_("Template to generate text response. In jinja2.")) + help_text=_("Template to generate text response. In jinja2 format. http://jinja.pocoo.org/")) keyboard_template = models.TextField(null=True, blank=True, verbose_name=_("Keyboard template"), validators=[validators.validate_template, validators.validate_telegram_keyboard], - help_text=_("Template to generate keyboard response. In jinja2.")) + help_text=_("Template to generate keyboard response. In jinja2 format. http://jinja.pocoo.org/")) class Meta: verbose_name = _('Response') diff --git a/microbot/models/state.py b/microbot/models/state.py index b0b9a10..200feb9 100644 --- a/microbot/models/state.py +++ b/microbot/models/state.py @@ -12,9 +12,9 @@ @python_2_unicode_compatible class State(MicrobotModel): name = models.CharField(_('State name'), db_index=True, max_length=255, - help_text=_("Set name to state which helps you to remember it.")) + help_text=_("Name of the state")) bot = models.ForeignKey('Bot', verbose_name=_('Bot'), related_name='states', - help_text=_("Bot which state is attached to.")) + help_text=_("Bot which state is attached to")) class Meta: verbose_name = _('State') @@ -27,9 +27,9 @@ def __str__(self): @python_2_unicode_compatible class ChatState(MicrobotModel): chat = models.OneToOneField(Chat, db_index=True, verbose_name=_('Chat'), - help_text=_("Chat identifier. Telegram API format.")) + help_text=_("Chat in Telegram API format. https://core.telegram.org/bots/api#chat")) state = models.ForeignKey(State, verbose_name=_('State'), related_name='chat', - help_text=_("State related to the chat.")) + help_text=_("State related to the chat")) context = models.TextField(verbose_name=_("Context"), help_text=_("Context serialized to json when this state was set"), null=True, blank=True) diff --git a/microbot/serializers/bot.py b/microbot/serializers/bot.py index 5833fb0..9a098e8 100644 --- a/microbot/serializers/bot.py +++ b/microbot/serializers/bot.py @@ -1,11 +1,12 @@ from rest_framework import serializers from microbot.models import Bot from microbot.serializers import UserAPISerializer - +from django.utils.translation import ugettext_lazy as _ class BotSerializer(serializers.ModelSerializer): - id = serializers.ReadOnlyField() - info = UserAPISerializer(many=False, source='user_api', read_only=True) + id = serializers.ReadOnlyField(help_text=_("Bot ID")) + info = UserAPISerializer(many=False, source='user_api', read_only=True, + help_text=_("Telegram API info. Automatically retrieved from Telegram")) class Meta: model = Bot @@ -13,7 +14,7 @@ class Meta: read_only_fields = ('id', 'created_at', 'updated_at', 'info') class BotUpdateSerializer(serializers.ModelSerializer): - enabled = serializers.BooleanField(required=True) + enabled = serializers.BooleanField(required=True, help_text=_("Enable/disable bot")) class Meta: model = Bot diff --git a/microbot/serializers/environment_vars.py b/microbot/serializers/environment_vars.py index 760a853..6f04d9c 100644 --- a/microbot/serializers/environment_vars.py +++ b/microbot/serializers/environment_vars.py @@ -1,8 +1,10 @@ from rest_framework import serializers from microbot.models import EnvironmentVar +from django.utils.translation import ugettext_lazy as _ + class EnvironmentVarSerializer(serializers.ModelSerializer): - id = serializers.ReadOnlyField() + id = serializers.ReadOnlyField(help_text=_("Environment variable ID")) class Meta: model = EnvironmentVar diff --git a/microbot/serializers/handler.py b/microbot/serializers/handler.py index c6cab47..744cb7a 100644 --- a/microbot/serializers/handler.py +++ b/microbot/serializers/handler.py @@ -2,10 +2,10 @@ from microbot.models import Handler, Request, Response, UrlParam, HeaderParam, State from microbot.serializers import StateSerializer, ResponseSerializer, ResponseUpdateSerializer from microbot import validators - +from django.utils.translation import ugettext_lazy as _ class AbsParamSerializer(serializers.HyperlinkedModelSerializer): - id = serializers.ReadOnlyField() + id = serializers.ReadOnlyField(help_text=_("Parameter ID")) class Meta: model = UrlParam @@ -13,25 +13,27 @@ class Meta: read_only_fields = ('id', 'created_at', 'updated_at',) class RequestSerializer(serializers.HyperlinkedModelSerializer): - url_parameters = AbsParamSerializer(many=True, required=False) - header_parameters = AbsParamSerializer(many=True, required=False) + url_parameters = AbsParamSerializer(many=True, required=False, help_text=_("List of url parameters used to complete the request")) + header_parameters = AbsParamSerializer(many=True, required=False, help_text=_("List of header parameters used to complete the request")) class Meta: model = Request fields = ('url_template', 'method', 'data', 'url_parameters', 'header_parameters') class RequestUpdateSerializer(RequestSerializer): - url_template = serializers.CharField(required=False, max_length=255, validators=[validators.validate_template]) - method = serializers.ChoiceField(choices=Request.METHOD_CHOICES, required=False) + url_template = serializers.CharField(required=False, max_length=255, validators=[validators.validate_template], + help_text=_("Url to request. A jinja2 template. http://jinja.pocoo.org/")) + method = serializers.ChoiceField(choices=Request.METHOD_CHOICES, required=False, + help_text=_("Define Http method for the request")) class HandlerSerializer(serializers.ModelSerializer): - id = serializers.ReadOnlyField() - request = RequestSerializer(many=False, required=False) - response = ResponseSerializer(many=False) - target_state = StateSerializer(many=False, required=False) - source_states = StateSerializer(many=True, required=False) - priority = serializers.IntegerField(required=False) + id = serializers.ReadOnlyField(help_text=_("Handler ID")) + request = RequestSerializer(many=False, required=False, help_text=_("Url request the handler executes to obtain data")) + response = ResponseSerializer(many=False, help_text=_("Template the handler uses to generate response")) + target_state = StateSerializer(many=False, required=False, help_text=_("This state will be set when handler ends processing")) + source_states = StateSerializer(many=True, required=False, help_text=_("Bot states the Handler needs to be to execute. Set none if any")) + priority = serializers.IntegerField(required=False, help_text=_("Set priority execution. Higher value higher priority")) class Meta: model = Handler @@ -101,8 +103,13 @@ def update(self, instance, validated_data): return instance class HandlerUpdateSerializer(HandlerSerializer): - name = serializers.CharField(required=False, max_length=100) - pattern = serializers.CharField(required=False, max_length=250, validators=[validators.validate_pattern]) - priority = serializers.IntegerField(required=False, min_value=0) - response = ResponseUpdateSerializer(many=False, required=False) - request = RequestUpdateSerializer(many=False, required=False) \ No newline at end of file + name = serializers.CharField(required=False, max_length=100, help_text=_("Name for the handler")) + pattern = serializers.CharField(required=False, max_length=250, validators=[validators.validate_pattern], + help_text=_("""Regular expression the Handler will be triggered. + Using https://docs.python.org/2/library/re.html#regular-expression-syntax""")) + priority = serializers.IntegerField(required=False, min_value=0, + help_text=_("Set priority execution. Higher value higher priority")) + response = ResponseUpdateSerializer(many=False, required=False, + help_text=_("Template the handler uses to generate response")) + request = RequestUpdateSerializer(many=False, required=False, + help_text=_("Url request the handler executes to obtain data")) \ No newline at end of file diff --git a/microbot/serializers/hook.py b/microbot/serializers/hook.py index 0a53691..b3d4f42 100644 --- a/microbot/serializers/hook.py +++ b/microbot/serializers/hook.py @@ -1,9 +1,11 @@ from rest_framework import serializers from microbot.models import Hook, Recipient, Response from microbot.serializers import ResponseSerializer, ResponseUpdateSerializer +from django.utils.translation import ugettext_lazy as _ + class RecipientSerializer(serializers.HyperlinkedModelSerializer): - id = serializers.ReadOnlyField() + id = serializers.ReadOnlyField(help_text=_("Recipient ID")) class Meta: model = Recipient @@ -11,9 +13,9 @@ class Meta: read_only_fields = ('id', 'created_at', 'updated_at', ) class HookSerializer(serializers.ModelSerializer): - id = serializers.ReadOnlyField() - response = ResponseSerializer(many=False) - recipients = RecipientSerializer(many=True, required=False, read_only=True) + id = serializers.ReadOnlyField(help_text=_("Hook ID")) + response = ResponseSerializer(many=False, help_text=_("Template the hook uses to generate the response")) + recipients = RecipientSerializer(many=True, required=False, read_only=True, help_text=_("List of recipients the hook responses to")) class Meta: model = Hook @@ -55,8 +57,8 @@ def update(self, instance, validated_data): return instance class HookUpdateSerializer(HookSerializer): - name = serializers.CharField(required=False, max_length=200) - response = ResponseUpdateSerializer(many=False, required=False) + name = serializers.CharField(required=False, max_length=200, help_text=_("Name of the hook")) + response = ResponseUpdateSerializer(many=False, required=False, help_text=_("Template the hook uses to generate the response")) def update(self, instance, validated_data): instance.name = validated_data.get('name', instance.name) diff --git a/microbot/serializers/response.py b/microbot/serializers/response.py index f7d1c1d..3a002e8 100644 --- a/microbot/serializers/response.py +++ b/microbot/serializers/response.py @@ -1,7 +1,7 @@ from rest_framework import serializers from microbot.models import Response from microbot import validators - +from django.utils.translation import ugettext_lazy as _ class ResponseSerializer(serializers.HyperlinkedModelSerializer): class Meta: @@ -10,6 +10,8 @@ class Meta: class ResponseUpdateSerializer(ResponseSerializer): text_template = serializers.CharField(required=False, max_length=1000, - validators=[validators.validate_template, validators.validate_telegram_text_html]) + validators=[validators.validate_template, validators.validate_telegram_text_html], + help_text=_("Template to generate text response. In jinja2 format. http://jinja.pocoo.org/")) keyboard_template = serializers.CharField(required=False, max_length=1000, - validators=[validators.validate_template, validators.validate_telegram_keyboard]) \ No newline at end of file + validators=[validators.validate_template, validators.validate_telegram_keyboard], + help_text=_("Template to generate keyboard response. In jinja2 format. http://jinja.pocoo.org/")) \ No newline at end of file diff --git a/microbot/serializers/state.py b/microbot/serializers/state.py index 8a9b635..3321ae3 100644 --- a/microbot/serializers/state.py +++ b/microbot/serializers/state.py @@ -1,8 +1,10 @@ from rest_framework import serializers from microbot.models import State, ChatState, Chat +from django.utils.translation import ugettext_lazy as _ + class StateSerializer(serializers.HyperlinkedModelSerializer): - id = serializers.ReadOnlyField() + id = serializers.ReadOnlyField(help_text=_("State ID")) class Meta: model = State @@ -10,9 +12,9 @@ class Meta: read_only_fields = ('id', 'created_at', 'updated_at',) class ChatStateSerializer(serializers.ModelSerializer): - id = serializers.ReadOnlyField() - chat = serializers.IntegerField(source="chat.id") - state = StateSerializer(many=False) + id = serializers.ReadOnlyField(help_text=_("Chat State ID")) + chat = serializers.IntegerField(source="chat.id", help_text=_("Chat identifier. Telegram API format. https://core.telegram.org/bots/api#chat")) + state = StateSerializer(many=False, help_text=_("State associated to the Chat")) class Meta: model = ChatState @@ -38,8 +40,9 @@ def update(self, instance, validated_data): return instance class ChatStateUpdateSerializer(ChatStateSerializer): - chat = serializers.IntegerField(source="chat.id", required=False) - state = StateSerializer(many=False, required=False) + chat = serializers.IntegerField(source="chat.id", required=False, + help_text=_("Chat identifier. Telegram API format. https://core.telegram.org/bots/api#chat")) + state = StateSerializer(many=False, required=False, help_text=_("State associated to the Chat")) def update(self, instance, validated_data): if 'chat' in validated_data: diff --git a/microbot/urls.py b/microbot/urls.py deleted file mode 100644 index 2d004e3..0000000 --- a/microbot/urls.py +++ /dev/null @@ -1,54 +0,0 @@ -from django.conf.urls import url -from django.views.decorators.csrf import csrf_exempt -from microbot import views - - -def uuidzy(url): - return url.replace('%u', '[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}') - -# hooks -urlpatterns = [ - url(r'^telegrambot/(?P[-_:a-zA-Z0-9]+)/$', csrf_exempt(views.TelegramHookView.as_view()), name='telegrambot'), - url(r'^hook/(?P\w+)/$', csrf_exempt(views.MicrobotHookView.as_view()), name='hook')] - -# bots api -urlpatterns += [ - url(r'^api/bots/$', views.BotList.as_view(), name='bot-list'), - url(uuidzy(r'^api/bots/(?P%u)/$'), views.BotDetail.as_view(), name='bot-detail')] - -# environment variables api -urlpatterns += [ - url(uuidzy(r'^api/bots/(?P%u)/env/$'), views.EnvironmentVarList.as_view(), name='env-list'), - url(uuidzy(r'^api/bots/(?P%u)/env/(?P%u)/$'), views.EnvironmentVarDetail.as_view(), name='env-list')] - -# handlers api -urlpatterns += [ - url(uuidzy(r'^api/bots/(?P%u)/handlers/$'), views.HandlerList.as_view(), name='handler-list'), - url(uuidzy(r'^api/bots/(?P%u)/handlers/(?P%u)/$'), views.HandlerDetail.as_view(), name='handler-detail'), - url(uuidzy(r'^api/bots/(?P%u)/handlers/(?P%u)/urlparams/$'), views.UrlParameterList.as_view(), - name='handler-urlparameter-list'), - url(uuidzy(r'^api/bots/(?P%u)/handlers/(?P%u)/urlparams/(?P%u)/$'), - views.UrlParameterDetail.as_view(), name='handler-urlparameter-detail'), - url(uuidzy(r'^api/bots/(?P%u)/handlers/(?P%u)/headerparams/$'), views.HeaderParameterList.as_view(), - name='handler-headerparameter-list'), - url(uuidzy(r'^api/bots/(?P%u)/handlers/(?P%u)/headerparams/(?P%u)/$'), - views.HeaderParameterDetail.as_view(), name='handler-headerparameter-detail'), - url(uuidzy(r'^api/bots/(?P%u)/handlers/(?P%u)/sourcestates/$'), views.SourceStateList.as_view(), - name='handler-sourcestate-list'), - url(uuidzy(r'^api/bots/(?P%u)/handlers/(?P%u)/sourcestates/(?P%u)/$'), - views.SourceStateDetail.as_view(), name='handler-sourcestate-detail')] - -# hooks api -urlpatterns += [ - url(uuidzy(r'^api/bots/(?P%u)/hooks/$'), views.HookList.as_view(), name='hook-list'), - url(uuidzy(r'^api/bots/(?P%u)/hooks/(?P%u)/$'), views.HookDetail.as_view(), name='hook-detail'), - url(uuidzy(r'^api/bots/(?P%u)/hooks/(?P%u)/recipients/$'), views.RecipientList.as_view(), name='hook-recipient-list'), - url(uuidzy(r'^api/bots/(?P%u)/hooks/(?P%u)/recipients/(?P%u)/$'), views.RecipientDetail.as_view(), - name='hook-recipient-list')] - -# states api -urlpatterns += [ - url(uuidzy(r'^api/bots/(?P%u)/states/$'), views.StateList.as_view(), name='state-list'), - url(uuidzy(r'^api/bots/(?P%u)/states/(?P%u)/$'), views.StateDetail.as_view(), name='state-detail'), - url(uuidzy(r'^api/bots/(?P%u)/chatstates/$'), views.ChatStateList.as_view(), name='chatstate-list'), - url(uuidzy(r'^api/bots/(?P%u)/chatstates/(?P%u)/$'), views.ChatStateDetail.as_view(), name='chatstate-detail')] diff --git a/microbot/urls_api.py b/microbot/urls_api.py new file mode 100644 index 0000000..67ceaf5 --- /dev/null +++ b/microbot/urls_api.py @@ -0,0 +1,48 @@ +from django.conf.urls import url +from microbot import views + + +def uuidzy(url): + return url.replace('%u', '[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}') + +# bots api +urlpatterns = [ + url(r'^bots/$', views.BotList.as_view(), name='bot-list'), + url(uuidzy(r'^bots/(?P%u)/$'), views.BotDetail.as_view(), name='bot-detail')] + +# environment variables api +urlpatterns += [ + url(uuidzy(r'^bots/(?P%u)/env/$'), views.EnvironmentVarList.as_view(), name='env-list'), + url(uuidzy(r'^bots/(?P%u)/env/(?P%u)/$'), views.EnvironmentVarDetail.as_view(), name='env-list')] + +# handlers api +urlpatterns += [ + url(uuidzy(r'^bots/(?P%u)/handlers/$'), views.HandlerList.as_view(), name='handler-list'), + url(uuidzy(r'^bots/(?P%u)/handlers/(?P%u)/$'), views.HandlerDetail.as_view(), name='handler-detail'), + url(uuidzy(r'^bots/(?P%u)/handlers/(?P%u)/urlparams/$'), views.UrlParameterList.as_view(), + name='handler-urlparameter-list'), + url(uuidzy(r'^bots/(?P%u)/handlers/(?P%u)/urlparams/(?P%u)/$'), + views.UrlParameterDetail.as_view(), name='handler-urlparameter-detail'), + url(uuidzy(r'^bots/(?P%u)/handlers/(?P%u)/headerparams/$'), views.HeaderParameterList.as_view(), + name='handler-headerparameter-list'), + url(uuidzy(r'^bots/(?P%u)/handlers/(?P%u)/headerparams/(?P%u)/$'), + views.HeaderParameterDetail.as_view(), name='handler-headerparameter-detail'), + url(uuidzy(r'^bots/(?P%u)/handlers/(?P%u)/sourcestates/$'), views.SourceStateList.as_view(), + name='handler-sourcestate-list'), + url(uuidzy(r'^bots/(?P%u)/handlers/(?P%u)/sourcestates/(?P%u)/$'), + views.SourceStateDetail.as_view(), name='handler-sourcestate-detail')] + +# hooks api +urlpatterns += [ + url(uuidzy(r'^bots/(?P%u)/hooks/$'), views.HookList.as_view(), name='hook-list'), + url(uuidzy(r'^bots/(?P%u)/hooks/(?P%u)/$'), views.HookDetail.as_view(), name='hook-detail'), + url(uuidzy(r'^bots/(?P%u)/hooks/(?P%u)/recipients/$'), views.RecipientList.as_view(), name='hook-recipient-list'), + url(uuidzy(r'^bots/(?P%u)/hooks/(?P%u)/recipients/(?P%u)/$'), views.RecipientDetail.as_view(), + name='hook-recipient-list')] + +# states api +urlpatterns += [ + url(uuidzy(r'^bots/(?P%u)/states/$'), views.StateList.as_view(), name='state-list'), + url(uuidzy(r'^bots/(?P%u)/states/(?P%u)/$'), views.StateDetail.as_view(), name='state-detail'), + url(uuidzy(r'^bots/(?P%u)/chatstates/$'), views.ChatStateList.as_view(), name='chatstate-list'), + url(uuidzy(r'^bots/(?P%u)/chatstates/(?P%u)/$'), views.ChatStateDetail.as_view(), name='chatstate-detail')] diff --git a/microbot/urls_processing.py b/microbot/urls_processing.py new file mode 100644 index 0000000..85263c4 --- /dev/null +++ b/microbot/urls_processing.py @@ -0,0 +1,7 @@ +from django.conf.urls import url +from django.views.decorators.csrf import csrf_exempt +from microbot import views + +urlpatterns = [ + url(r'^telegrambot/(?P[-_:a-zA-Z0-9]+)/$', csrf_exempt(views.TelegramHookView.as_view()), name='telegrambot'), + url(r'^hook/(?P\w+)/$', csrf_exempt(views.MicrobotHookView.as_view()), name='hook')] diff --git a/microbot/views/api/bot.py b/microbot/views/api/bot.py index 6217e07..d6c5cb5 100644 --- a/microbot/views/api/bot.py +++ b/microbot/views/api/bot.py @@ -10,14 +10,32 @@ logger = logging.getLogger(__name__) -class BotList(MicrobotAPIView): +class BotList(MicrobotAPIView): def get(self, request, format=None): + """ + Get list of bots + --- + serializer: BotSerializer + responseMessages: + - code: 401 + message: Not authenticated + """ bots = Bot.objects.filter(owner=request.user) serializer = BotSerializer(bots, many=True) return Response(serializer.data) def post(self, request, format=None): + """ + Add a new bot + --- + serializer: BotSerializer + responseMessages: + - code: 401 + message: Not authenticated + - code: 400 + message: Not valid request + """ serializer = BotSerializer(data=request.data) if serializer.is_valid(): try: @@ -33,13 +51,31 @@ def post(self, request, format=None): class BotDetail(MicrobotAPIView): - def get(self, request, pk, format=None): - bot = self.get_bot(pk, request.user) + def get(self, request, id, format=None): + """ + Get bot by id + --- + serializer: BotSerializer + responseMessages: + - code: 401 + message: Not authenticated + """ + bot = self.get_bot(id, request.user) serializer = BotSerializer(bot) return Response(serializer.data) - def put(self, request, pk, format=None): - bot = self.get_bot(pk, request.user) + def put(self, request, id, format=None): + """ + Update an existing bot + --- + serializer: BotUpdateSerializer + responseMessages: + - code: 401 + message: Not authenticated + - code: 400 + message: Not valid request + """ + bot = self.get_bot(id, request.user) serializer = BotUpdateSerializer(bot, data=request.data) if serializer.is_valid(): try: @@ -50,7 +86,14 @@ def put(self, request, pk, format=None): return Response(serializer.data) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) - def delete(self, request, pk, format=None): - bot = self.get_bot(pk, request.user) + def delete(self, request, id, format=None): + """ + Delete an existing bot + --- + responseMessages: + - code: 401 + message: Not authenticated + """ + bot = self.get_bot(id, request.user) bot.delete() return Response(status=status.HTTP_204_NO_CONTENT) \ No newline at end of file diff --git a/microbot/views/api/environment_vars.py b/microbot/views/api/environment_vars.py index 1930347..7df015a 100644 --- a/microbot/views/api/environment_vars.py +++ b/microbot/views/api/environment_vars.py @@ -18,7 +18,65 @@ def _creator(self, bot, serializer): EnvironmentVar.objects.create(bot=bot, key=serializer.data['key'], value=serializer.data['value']) + + def get(self, request, bot_id, format=None): + """ + Get list of environment variables + --- + serializer: EnvironmentVarSerializer + responseMessages: + - code: 401 + message: Not authenticated + """ + return super(EnvironmentVarList, self).get(request, bot_id, format) + + def post(self, request, bot_id, format=None): + """ + Add a new environment variable + --- + serializer: EnvironmentVarSerializer + responseMessages: + - code: 401 + message: Not authenticated + - code: 400 + message: Not valid request + """ + return super(EnvironmentVarList, self).post(request, bot_id, format) class EnvironmentVarDetail(DetailBotAPIView): model = EnvironmentVar - serializer = EnvironmentVarSerializer \ No newline at end of file + serializer = EnvironmentVarSerializer + + def get(self, request, bot_id, id, format=None): + """ + Get environment variable by id + --- + serializer: EnvironmentVarSerializer + responseMessages: + - code: 401 + message: Not authenticated + """ + return super(EnvironmentVarDetail, self).get(request, bot_id, id, format) + + def put(self, request, bot_id, id, format=None): + """ + Update existing environment variable + --- + serializer: EnvironmentVarSerializer + responseMessages: + - code: 401 + message: Not authenticated + - code: 400 + message: Not valid request + """ + return super(EnvironmentVarDetail, self).put(request, bot_id, id, format) + + def delete(self, request, bot_id, id, format=None): + """ + Delete existing environment variable + --- + responseMessages: + - code: 401 + message: Not authenticated + """ + return super(EnvironmentVarDetail, self).delete(request, bot_id, id, format) \ No newline at end of file diff --git a/microbot/views/api/handler.py b/microbot/views/api/handler.py index 67d1460..9325ec2 100644 --- a/microbot/views/api/handler.py +++ b/microbot/views/api/handler.py @@ -37,11 +37,69 @@ def _creator(self, bot, serializer): request=request, target_state=target_state) + def get(self, request, bot_id, format=None): + """ + Get list of handlers + --- + serializer: HandlerSerializer + responseMessages: + - code: 401 + message: Not authenticated + """ + return super(HandlerList, self).get(request, bot_id, format) + + def post(self, request, bot_id, format=None): + """ + Add a new handler + --- + serializer: HandlerSerializer + responseMessages: + - code: 401 + message: Not authenticated + - code: 400 + message: Not valid request + """ + return super(HandlerList, self).post(request, bot_id, format) + class HandlerDetail(DetailBotAPIView): model = Handler serializer = HandlerSerializer serializer_update = HandlerUpdateSerializer + def get(self, request, bot_id, id, format=None): + """ + Get handler by id + --- + serializer: HandlerSerializer + responseMessages: + - code: 401 + message: Not authenticated + """ + return super(HandlerDetail, self).get(request, bot_id, id, format) + + def put(self, request, bot_id, id, format=None): + """ + Update existing handler + --- + serializer: HandlerUpdateSerializer + responseMessages: + - code: 401 + message: Not authenticated + - code: 400 + message: Not valid request + """ + return super(HandlerDetail, self).put(request, bot_id, id, format) + + def delete(self, request, bot_id, id, format=None): + """ + Delete existing handler + --- + responseMessages: + - code: 401 + message: Not authenticated + """ + return super(HandlerDetail, self).delete(request, bot_id, id, format) + class UrlParameterList(ObjectBotListView): serializer = AbsParamSerializer @@ -55,6 +113,30 @@ def _creator(self, obj, serializer): value_template=serializer.data['value_template'], request=obj.request) + def get(self, request, bot_id, id, format=None): + """ + Get list of url parameters of a handler + --- + serializer: AbsParamSerializer + responseMessages: + - code: 401 + message: Not authenticated + """ + return super(UrlParameterList, self).get(request, bot_id, id, format) + + def post(self, request, bot_id, id, format=None): + """ + Add a new url parameter to a handler + --- + serializer: AbsParamSerializer + responseMessages: + - code: 401 + message: Not authenticated + - code: 400 + message: Not valid request + """ + return super(UrlParameterList, self).post(request, bot_id, id, format) + class HeaderParameterList(ObjectBotListView): serializer = AbsParamSerializer @@ -68,13 +150,37 @@ def _creator(self, obj, serializer): value_template=serializer.data['value_template'], request=obj.request) + def get(self, request, bot_id, id, format=None): + """ + Get list of header parameters of a handler + --- + serializer: AbsParamSerializer + responseMessages: + - code: 401 + message: Not authenticated + """ + return super(HeaderParameterList, self).get(request, bot_id, id, format) + + def post(self, request, bot_id, id, format=None): + """ + Add a new header parameter to a handler + --- + serializer: AbsParamSerializer + responseMessages: + - code: 401 + message: Not authenticated + - code: 400 + message: Not valid request + """ + return super(HeaderParameterList, self).post(request, bot_id, id, format) + class RequestDetailView(MicrobotAPIView): model = None serializer = None - def get_handler(self, pk, bot, user): + def get_handler(self, id, bot, user): try: - handler = Handler.objects.get(pk=pk, bot=bot) + handler = Handler.objects.get(id=id, bot=bot) if handler.bot.owner != user: raise exceptions.AuthenticationFailed() return handler @@ -84,36 +190,36 @@ def get_handler(self, pk, bot, user): def _user(self, handler): return handler.bot.owner - def get_object(self, pk, handler, user): + def get_object(self, id, handler, user): try: - obj = self.model.objects.get(pk=pk, request=handler.request) + obj = self.model.objects.get(id=id, request=handler.request) if self._user(handler) != user: raise exceptions.AuthenticationFailed() return obj except self.model.DoesNotExist: raise Http404 - def get(self, request, bot_pk, handler_pk, pk, format=None): - bot = self.get_bot(bot_pk, request.user) - handler = self.get_handler(handler_pk, bot, request.user) - obj = self.get_object(pk, handler, request.user) + def get(self, request, bot_id, handler_id, id, format=None): + bot = self.get_bot(bot_id, request.user) + handler = self.get_handler(handler_id, bot, request.user) + obj = self.get_object(id, handler, request.user) serializer = self.serializer(obj) return Response(serializer.data) - def put(self, request, bot_pk, handler_pk, pk, format=None): - bot = self.get_bot(bot_pk, request.user) - handler = self.get_handler(handler_pk, bot, request.user) - obj = self.get_object(pk, handler, request.user) + def put(self, request, bot_id, handler_id, id, format=None): + bot = self.get_bot(bot_id, request.user) + handler = self.get_handler(handler_id, bot, request.user) + obj = self.get_object(id, handler, request.user) serializer = self.serializer(obj, data=request.data) if serializer.is_valid(): serializer.save() return Response(serializer.data) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) - def delete(self, request, bot_pk, handler_pk, pk, format=None): - bot = self.get_bot(bot_pk, request.user) - handler = self.get_handler(handler_pk, bot, request.user) - obj = self.get_object(pk, handler, request.user) + def delete(self, request, bot_id, handler_id, id, format=None): + bot = self.get_bot(bot_id, request.user) + handler = self.get_handler(handler_id, bot, request.user) + obj = self.get_object(id, handler, request.user) obj.delete() return Response(status=status.HTTP_204_NO_CONTENT) @@ -121,15 +227,83 @@ class UrlParameterDetail(RequestDetailView): model = UrlParam serializer = AbsParamSerializer + def get(self, request, bot_id, handler_id, id, format=None): + """ + Get url parameter by id + --- + serializer: AbsParamSerializer + responseMessages: + - code: 401 + message: Not authenticated + """ + return super(UrlParameterDetail, self).get(request, bot_id, handler_id, id, format) + + def put(self, request, bot_id, handler_id, id, format=None): + """ + Update an existing url parameter + --- + serializer: AbsParamSerializer + responseMessages: + - code: 401 + message: Not authenticated + - code: 400 + message: Not valid request + """ + return super(UrlParameterDetail, self).put(request, bot_id, handler_id, id, format) + + def delete(self, request, bot_id, handler_id, id, format=None): + """ + Delete an existing url parameter + --- + responseMessages: + - code: 401 + message: Not authenticated + """ + return super(UrlParameterDetail, self).delete(request, bot_id, handler_id, id, format) + class HeaderParameterDetail(RequestDetailView): model = HeaderParam - serializer = AbsParamSerializer + serializer = AbsParamSerializer + + def get(self, request, bot_id, handler_id, id, format=None): + """ + Get header parameter by id + --- + serializer: AbsParamSerializer + responseMessages: + - code: 401 + message: Not authenticated + """ + return super(HeaderParameterDetail, self).get(request, bot_id, handler_id, id, format) + + def put(self, request, bot_id, handler_id, id, format=None): + """ + Update an existing header parameter + --- + serializer: AbsParamSerializer + responseMessages: + - code: 401 + message: Not authenticated + - code: 400 + message: Not valid request + """ + return super(HeaderParameterDetail, self).put(request, bot_id, handler_id, id, format) + + def delete(self, request, bot_id, handler_id, id, format=None): + """ + Delete an existing header parameter + --- + responseMessages: + - code: 401 + message: Not authenticated + """ + return super(HeaderParameterDetail, self).delete(request, bot_id, handler_id, id, format) class FromHandlerViewMixin(object): - def get_handler(self, pk, bot, user): + def get_handler(self, id, bot, user): try: - handler = Handler.objects.get(pk=pk, bot=bot) + handler = Handler.objects.get(id=id, bot=bot) if handler.bot.owner != user: raise exceptions.AuthenticationFailed() return handler @@ -147,16 +321,74 @@ def _query(self, bot, obj): def _creator(self, obj, serializer): state, _ = State.objects.get_or_create(name=serializer.data['name'], bot=obj.bot) obj.source_states.add(state) + + def get(self, request, bot_id, id, format=None): + """ + Get list of source state of a handler + --- + serializer: StateSerializer + responseMessages: + - code: 401 + message: Not authenticated + """ + return super(SourceStateList, self).get(request, bot_id, id, format) + + def post(self, request, bot_id, id, format=None): + """ + Add a new source state to a handler + --- + serializer: StateSerializer + responseMessages: + - code: 401 + message: Not authenticated + - code: 400 + message: Not valid request + """ + return super(SourceStateList, self).post(request, bot_id, id, format) class SourceStateDetail(RequestDetailView): model = State serializer = StateSerializer - def get_object(self, pk, handler, user): + def get_object(self, id, handler, user): try: - obj = self.model.objects.get(pk=pk, bot=handler.bot) + obj = self.model.objects.get(id=id, bot=handler.bot) if self._user(handler) != user: raise exceptions.AuthenticationFailed() return obj except self.model.DoesNotExist: - raise Http404 \ No newline at end of file + raise Http404 + + def get(self, request, bot_id, handler_id, id, format=None): + """ + Get source state by id + --- + serializer: StateSerializer + responseMessages: + - code: 401 + message: Not authenticated + """ + return super(SourceStateDetail, self).get(request, bot_id, handler_id, id, format) + + def put(self, request, bot_id, handler_id, id, format=None): + """ + Update an existing source state + --- + serializer: StateSerializer + responseMessages: + - code: 401 + message: Not authenticated + - code: 400 + message: Not valid request + """ + return super(SourceStateDetail, self).put(request, bot_id, handler_id, id, format) + + def delete(self, request, bot_id, handler_id, id, format=None): + """ + Delete an existing source state + --- + responseMessages: + - code: 401 + message: Not authenticated + """ + return super(SourceStateDetail, self).delete(request, bot_id, handler_id, id, format) \ No newline at end of file diff --git a/microbot/views/api/hook.py b/microbot/views/api/hook.py index 89c33b1..5b06a26 100644 --- a/microbot/views/api/hook.py +++ b/microbot/views/api/hook.py @@ -26,6 +26,30 @@ def _creator(self, bot, serializer): enabled=serializer.data['enabled'], response=response, name=serializer.data['name']) + + def get(self, request, bot_id, format=None): + """ + Get list of hooks + --- + serializer: HookSerializer + responseMessages: + - code: 401 + message: Not authenticated + """ + return super(HookList, self).get(request, bot_id, format) + + def post(self, request, bot_id, format=None): + """ + Add a new hook + --- + serializer: HookSerializer + responseMessages: + - code: 401 + message: Not authenticated + - code: 400 + message: Not valid request + """ + return super(HookList, self).post(request, bot_id, format) class HookDetail(DetailBotAPIView): @@ -33,6 +57,40 @@ class HookDetail(DetailBotAPIView): serializer = HookSerializer serializer_update = HookUpdateSerializer + def get(self, request, bot_id, id, format=None): + """ + Get hook by id + --- + serializer: HookSerializer + responseMessages: + - code: 401 + message: Not authenticated + """ + return super(HookDetail, self).get(request, bot_id, id, format) + + def put(self, request, bot_id, id, format=None): + """ + Update existing hook + --- + serializer: HookUpdateSerializer + responseMessages: + - code: 401 + message: Not authenticated + - code: 400 + message: Not valid request + """ + return super(HookDetail, self).put(request, bot_id, id, format) + + def delete(self, request, bot_id, id, format=None): + """ + Delete existing hook + --- + responseMessages: + - code: 401 + message: Not authenticated + """ + return super(HookDetail, self).delete(request, bot_id, id, format) + class RecipientList(ObjectBotListView): serializer = RecipientSerializer obj_model = Hook @@ -43,15 +101,39 @@ def _query(self, bot, obj): def _creator(self, obj, serializer): Recipient.objects.create(chat_id=serializer.data['chat_id'], name=serializer.data['name'], - hook=obj) + hook=obj) + + def get(self, request, bot_id, id, format=None): + """ + Get list of recipients of a hook + --- + serializer: RecipientSerializer + responseMessages: + - code: 401 + message: Not authenticated + """ + return super(RecipientList, self).get(request, bot_id, id, format) + + def post(self, request, bot_id, id, format=None): + """ + Add a new recipient to a handler + --- + serializer: RecipientSerializer + responseMessages: + - code: 401 + message: Not authenticated + - code: 400 + message: Not valid request + """ + return super(RecipientList, self).post(request, bot_id, id, format) class RecipientDetail(MicrobotAPIView): model = Recipient serializer = RecipientSerializer - def get_hook(self, pk, bot, user): + def get_hook(self, id, bot, user): try: - hook = Hook.objects.get(pk=pk, bot=bot) + hook = Hook.objects.get(id=id, bot=bot) if hook.bot.owner != user: raise exceptions.AuthenticationFailed() return hook @@ -61,26 +143,44 @@ def get_hook(self, pk, bot, user): def _user(self, obj): return obj.hook.bot.owner - def get_recipient(self, pk, hook, user): + def get_recipient(self, id, hook, user): try: - obj = self.model.objects.get(pk=pk, hook=hook) + obj = self.model.objects.get(id=id, hook=hook) if self._user(obj) != user: raise exceptions.AuthenticationFailed() return obj except self.model.DoesNotExist: raise Http404 - def get(self, request, bot_pk, hook_pk, pk, format=None): - bot = self.get_bot(bot_pk, request.user) - hook = self.get_hook(hook_pk, bot, request.user) - recipient = self.get_recipient(pk, hook, request.user) + def get(self, request, bot_id, hook_id, id, format=None): + """ + Get recipient by id + --- + serializer: RecipientSerializer + responseMessages: + - code: 401 + message: Not authenticated + """ + bot = self.get_bot(bot_id, request.user) + hook = self.get_hook(hook_id, bot, request.user) + recipient = self.get_recipient(id, hook, request.user) serializer = self.serializer(recipient) return Response(serializer.data) - def put(self, request, bot_pk, hook_pk, pk, format=None): - bot = self.get_bot(bot_pk, request.user) - hook = self.get_hook(hook_pk, bot, request.user) - recipient = self.get_recipient(pk, hook, request.user) + def put(self, request, bot_id, hook_id, id, format=None): + """ + Update existing recipient + --- + serializer: RecipientSerializer + responseMessages: + - code: 401 + message: Not authenticated + - code: 400 + message: Not valid request + """ + bot = self.get_bot(bot_id, request.user) + hook = self.get_hook(hook_id, bot, request.user) + recipient = self.get_recipient(id, hook, request.user) serializer = self.serializer(recipient, data=request.data) if serializer.is_valid(): @@ -89,9 +189,16 @@ def put(self, request, bot_pk, hook_pk, pk, format=None): return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) - def delete(self, request, bot_pk, hook_pk, pk, format=None): - bot = self.get_bot(bot_pk, request.user) - hook = self.get_hook(hook_pk, bot, request.user) - recipient = self.get_recipient(pk, hook, request.user) + def delete(self, request, bot_id, hook_id, id, format=None): + """ + Delete an existing recipient + --- + responseMessages: + - code: 401 + message: Not authenticated + """ + bot = self.get_bot(bot_id, request.user) + hook = self.get_hook(hook_id, bot, request.user) + recipient = self.get_recipient(id, hook, request.user) recipient.delete() return Response(status=status.HTTP_204_NO_CONTENT) \ No newline at end of file diff --git a/microbot/views/api/state.py b/microbot/views/api/state.py index 0d43594..2025b6b 100644 --- a/microbot/views/api/state.py +++ b/microbot/views/api/state.py @@ -20,11 +20,69 @@ def _query(self, bot): def _creator(self, bot, serializer): State.objects.create(bot=bot, name=serializer.data['name']) + + def get(self, request, bot_id, format=None): + """ + Get list of states + --- + serializer: StateSerializer + responseMessages: + - code: 401 + message: Not authenticated + """ + return super(StateList, self).get(request, bot_id, format) + + def post(self, request, bot_id, format=None): + """ + Add a new state + --- + serializer: StateSerializer + responseMessages: + - code: 401 + message: Not authenticated + - code: 400 + message: Not valid request + """ + return super(StateList, self).post(request, bot_id, format) class StateDetail(DetailBotAPIView): model = State serializer = StateSerializer + def get(self, request, bot_id, id, format=None): + """ + Get state by id + --- + serializer: StateSerializer + responseMessages: + - code: 401 + message: Not authenticated + """ + return super(StateDetail, self).get(request, bot_id, id, format) + + def put(self, request, bot_id, id, format=None): + """ + Update existing state + --- + serializer: StateSerializer + responseMessages: + - code: 401 + message: Not authenticated + - code: 400 + message: Not valid request + """ + return super(StateDetail, self).put(request, bot_id, id, format) + + def delete(self, request, bot_id, id, format=None): + """ + Delete existing state + --- + responseMessages: + - code: 401 + message: Not authenticated + """ + return super(StateDetail, self).delete(request, bot_id, id, format) + class ChatStateList(ListBotAPIView): serializer = ChatStateSerializer @@ -53,6 +111,30 @@ def _creator(self, bot, serializer): ChatState.objects.create(state=state, chat=chat) + def get(self, request, bot_id, format=None): + """ + Get list of chat state + --- + serializer: ChatStateSerializer + responseMessages: + - code: 401 + message: Not authenticated + """ + return super(ChatStateList, self).get(request, bot_id, format) + + def post(self, request, bot_id, format=None): + """ + Add a new chat state + --- + serializer: ChatStateSerializer + responseMessages: + - code: 401 + message: Not authenticated + - code: 400 + message: Not valid request + """ + return super(ChatStateList, self).post(request, bot_id, format) + class ChatStateDetail(MicrobotAPIView): model = ChatState serializer = ChatStateSerializer @@ -61,9 +143,9 @@ class ChatStateDetail(MicrobotAPIView): def _user(self, obj): return obj.state.bot.owner - def get_object(self, pk, bot, user): + def get_object(self, id, bot, user): try: - obj = self.model.objects.get(pk=pk) + obj = self.model.objects.get(id=id) if self._user(obj) != user: raise exceptions.AuthenticationFailed() if obj.state.bot != bot: @@ -72,23 +154,48 @@ def get_object(self, pk, bot, user): except self.model.DoesNotExist: raise Http404 - def get(self, request, bot_pk, pk, format=None): - bot = self.get_bot(bot_pk, request.user) - obj = self.get_object(pk, bot, request.user) + def get(self, request, bot_id, id, format=None): + """ + Get chat state by id + --- + serializer: ChatStateSerializer + responseMessages: + - code: 401 + message: Not authenticated + """ + bot = self.get_bot(bot_id, request.user) + obj = self.get_object(id, bot, request.user) serializer = self.serializer(obj) return Response(serializer.data) - def put(self, request, bot_pk, pk, format=None): - bot = self.get_bot(bot_pk, request.user) - obj = self.get_object(pk, bot, request.user) + def put(self, request, bot_id, id, format=None): + """ + Update existing chat state + --- + serializer: ChatStateSerializer + responseMessages: + - code: 401 + message: Not authenticated + - code: 400 + message: Not valid request + """ + bot = self.get_bot(bot_id, request.user) + obj = self.get_object(id, bot, request.user) serializer = self.serializer_update(obj, data=request.data) if serializer.is_valid(): serializer.save() return Response(serializer.data) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) - def delete(self, request, bot_pk, pk, format=None): - bot = self.get_bot(bot_pk, request.user) - obj = self.get_object(pk, bot, request.user) + def delete(self, request, bot_id, id, format=None): + """ + Delete existing chat state + --- + responseMessages: + - code: 401 + message: Not authenticated + """ + bot = self.get_bot(bot_id, request.user) + obj = self.get_object(id, bot, request.user) obj.delete() return Response(status=status.HTTP_204_NO_CONTENT) \ No newline at end of file diff --git a/tests/urls.py b/tests/urls.py index 2f93b82..fa3caa6 100644 --- a/tests/urls.py +++ b/tests/urls.py @@ -12,5 +12,6 @@ url(r'^api-token-auth/', rdf_views.obtain_auth_token), url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')), url(r'^api/', include(router.urls)), - url(r'^microbot/', include('microbot.urls', namespace="microbot")), + url(r'^microbot/api/', include('microbot.urls_api', namespace="api")), + url(r'^process/', include('microbot.urls_processing', namespace="microbot")), ] \ No newline at end of file