Source code for syncano.models.instances

import json

import six
from syncano.exceptions import SyncanoValueError

from . import fields
from .base import Model
from .mixins import RenameMixin


[docs]class Instance(RenameMixin, Model): """ OO wrapper around instances `link <http://docs.syncano.com/docs/getting-started-with-syncano#adding-an-instance>`_. :ivar name: :class:`~syncano.models.fields.StringField` :ivar description: :class:`~syncano.models.fields.StringField` :ivar role: :class:`~syncano.models.fields.Field` :ivar owner: :class:`~syncano.models.fields.ModelField` :ivar links: :class:`~syncano.models.fields.HyperlinkedField` :ivar metadata: :class:`~syncano.models.fields.JSONField` :ivar created_at: :class:`~syncano.models.fields.DateTimeField` :ivar updated_at: :class:`~syncano.models.fields.DateTimeField` :ivar api_keys: :class:`~syncano.models.fields.RelatedManagerField` :ivar users: :class:`~syncano.models.fields.RelatedManagerField` :ivar admins: :class:`~syncano.models.fields.RelatedManagerField` :ivar scripts: :class:`~syncano.models.fields.RelatedManagerField` :ivar script_endpoints: :class:`~syncano.models.fields.RelatedManagerField` :ivar templates: :class:`~syncano.models.fields.RelatedManagerField` :ivar triggers: :class:`~syncano.models.fields.RelatedManagerField` :ivar schedules: :class:`~syncano.models.fields.RelatedManagerField` :ivar classes: :class:`~syncano.models.fields.RelatedManagerField` :ivar invitations: :class:`~syncano.models.fields.RelatedManagerField` :ivar gcm_devices: :class:`~syncano.models.fields.RelatedManagerField` :ivar gcm_messages: :class:`~syncano.models.fields.RelatedManagerField` :ivar apns_devices: :class:`~syncano.models.fields.RelatedManagerField` :ivar apns_messages: :class:`~syncano.models.fields.RelatedManagerField` """ name = fields.StringField(max_length=64, primary_key=True) description = fields.StringField(read_only=False, required=False) role = fields.Field(read_only=True, required=False) owner = fields.ModelField('Admin', read_only=True) links = fields.LinksField() metadata = fields.JSONField(read_only=False, required=False) created_at = fields.DateTimeField(read_only=True, required=False) updated_at = fields.DateTimeField(read_only=True, required=False) # user related fields; api_keys = fields.RelatedManagerField('ApiKey') users = fields.RelatedManagerField('User') admins = fields.RelatedManagerField('Admin') groups = fields.RelatedManagerField('Group') # snippets and data fields; scripts = fields.RelatedManagerField('Script') script_endpoints = fields.RelatedManagerField('ScriptEndpoint') data_endpoints = fields.RelatedManagerField('DataEndpoint') templates = fields.RelatedManagerField('ResponseTemplate') triggers = fields.RelatedManagerField('Trigger') schedules = fields.RelatedManagerField('Schedule') classes = fields.RelatedManagerField('Class') invitations = fields.RelatedManagerField('InstanceInvitation') hostings = fields.RelatedManagerField('Hosting') # push notifications fields; gcm_devices = fields.RelatedManagerField('GCMDevice') gcm_messages = fields.RelatedManagerField('GCMMessage') apns_devices = fields.RelatedManagerField('APNSDevice') apns_messages = fields.RelatedManagerField('APNSMessage') class Meta: endpoints = { 'detail': { 'methods': ['delete', 'patch', 'put', 'get'], 'path': '/v1.1/instances/{name}/', }, 'list': { 'methods': ['post', 'get'], 'path': '/v1.1/instances/', }, 'config': { 'methods': ['put', 'get'], 'path': '/v1.1/instances/{name}/snippets/config/', }, 'endpoints': { 'methods': ['get'], 'path': '/v1.1/instances/{name}/endpoints/sockets/' } }
[docs] def get_config(self): properties = self.get_endpoint_data() http_method = 'GET' endpoint = self._meta.resolve_endpoint('config', properties, http_method) connection = self._get_connection() return connection.request(http_method, endpoint)['config']
[docs] def set_config(self, config): if isinstance(config, six.string_types): try: config = json.loads(config) except (ValueError, TypeError): raise SyncanoValueError('Config string is not a parsable JSON.') if not isinstance(config, dict): raise SyncanoValueError('Retrieved Config is not a valid dict object.') properties = self.get_endpoint_data() http_method = 'PUT' endpoint = self._meta.resolve_endpoint('config', properties, http_method) data = {'config': config} connection = self._get_connection() connection.request(http_method, endpoint, data=data)
[docs]class ApiKey(Model): """ OO wrapper around instance api keys `link <http://docs.syncano.com/docs/authentication>`_. :ivar api_key: :class:`~syncano.models.fields.StringField` :ivar allow_user_create: :class:`~syncano.models.fields.BooleanField` :ivar ignore_acl: :class:`~syncano.models.fields.BooleanField` :ivar links: :class:`~syncano.models.fields.HyperlinkedField` """ api_key = fields.StringField(read_only=True, required=False) description = fields.StringField(required=False) allow_user_create = fields.BooleanField(required=False, default=False) ignore_acl = fields.BooleanField(required=False, default=False) allow_anonymous_read = fields.BooleanField(required=False, default=False) links = fields.LinksField() class Meta: parent = Instance endpoints = { 'detail': { 'methods': ['get', 'delete'], 'path': '/api_keys/{id}/', }, 'list': { 'methods': ['post', 'get'], 'path': '/api_keys/', } }
[docs]class InstanceInvitation(Model): """ OO wrapper around instance invitations `link <http://docs.syncano.com/docs/administrators#inviting-administrators>`_. :ivar email: :class:`~syncano.models.fields.EmailField` :ivar role: :class:`~syncano.models.fields.ChoiceField` :ivar key: :class:`~syncano.models.fields.StringField` :ivar state: :class:`~syncano.models.fields.StringField` :ivar links: :class:`~syncano.models.fields.HyperlinkedField` :ivar created_at: :class:`~syncano.models.fields.DateTimeField` :ivar updated_at: :class:`~syncano.models.fields.DateTimeField` """ from .accounts import Admin email = fields.EmailField(max_length=254) role = fields.ChoiceField(choices=Admin.ROLE_CHOICES) key = fields.StringField(read_only=True, required=False) state = fields.StringField(read_only=True, required=False) links = fields.LinksField() created_at = fields.DateTimeField(read_only=True, required=False) updated_at = fields.DateTimeField(read_only=True, required=False) class Meta: parent = Instance name = 'Invitation' endpoints = { 'detail': { 'methods': ['get', 'delete'], 'path': '/invitations/{id}/', }, 'list': { 'methods': ['post', 'get'], 'path': '/invitations/', } }
[docs] def resend(self): """ Resend the invitation. :return: InstanceInvitation instance; """ resend_path = self.links.resend connection = self._get_connection() connection.request('POST', resend_path) # empty response here: 204 no content return self