# -*- coding: utf-8 -*-
from .. import models
from .generic import AllMixin, GetByIdMixin, Manager, SyncMixin
[docs]class ProjectsManager(Manager, AllMixin, GetByIdMixin, SyncMixin):
state_name = 'projects'
object_type = 'project'
[docs] def add(self, name, **kwargs):
"""
Creates a local project object.
"""
obj = models.Project({'name': name}, self.api)
obj.temp_id = obj['id'] = '$' + self.api.generate_uuid()
obj.data.update(kwargs)
self.state[self.state_name].append(obj)
cmd = {
'type': 'project_add',
'temp_id': obj.temp_id,
'uuid': self.api.generate_uuid(),
'args': {key: obj.data[key] for key in obj.data if key != 'id'}
}
self.queue.append(cmd)
return obj
[docs] def update(self, project_id, **kwargs):
"""
Updates a project remotely.
"""
obj = self.get_by_id(project_id)
if obj:
obj.data.update(kwargs)
args = {'id': project_id}
args.update(kwargs)
cmd = {
'type': 'project_update',
'uuid': self.api.generate_uuid(),
'args': args,
}
self.queue.append(cmd)
[docs] def delete(self, project_id):
"""
Deletes a project remotely.
"""
cmd = {
'type': 'project_delete',
'uuid': self.api.generate_uuid(),
'args': {
'id': project_id,
},
}
self.queue.append(cmd)
[docs] def archive(self, project_id):
"""
Marks project as archived remotely.
"""
cmd = {
'type': 'project_archive',
'uuid': self.api.generate_uuid(),
'args': {
'id': project_id,
},
}
self.queue.append(cmd)
[docs] def unarchive(self, project_id):
"""
Marks project as unarchived remotely.
"""
cmd = {
'type': 'project_unarchive',
'uuid': self.api.generate_uuid(),
'args': {
'id': project_id,
},
}
self.queue.append(cmd)
[docs] def move(self, project_id, parent_id):
"""
Moves project to another parent.
"""
args = {
'id': project_id,
'parent_id': parent_id,
}
cmd = {
'type': 'project_move',
'uuid': self.api.generate_uuid(),
'args': args
}
self.queue.append(cmd)
[docs] def reorder(self, projects):
"""
Updates the child_order of the specified projects.
"""
cmd = {
'type': 'project_reorder',
'uuid': self.api.generate_uuid(),
'args': {
'projects': projects,
},
}
self.queue.append(cmd)
[docs] def share(self, project_id, email):
"""
Shares a project with a user.
"""
cmd = {
'type': 'share_project',
'temp_id': self.api.generate_uuid(),
'uuid': self.api.generate_uuid(),
'args': {
'project_id': project_id,
'email': email,
},
}
self.queue.append(cmd)
[docs] def get_archived(self):
"""
Returns archived projects.
"""
params = {'token': self.token}
return self.api._get('projects/get_archived', params=params)
[docs] def get_data(self, project_id):
"""
Returns a project's uncompleted items.
"""
params = {'token': self.token,
'project_id': project_id}
return self.api._get('projects/get_data', params=params)
[docs] def get(self, project_id):
"""
Gets an existing project.
"""
params = {'token': self.token,
'project_id': project_id}
obj = self.api._get('projects/get', params=params)
if obj and 'error' in obj:
return None
data = {'projects': [], 'project_notes': []}
if obj.get('project'):
data['projects'].append(obj.get('project'))
if obj.get('notes'):
data['project_notes'] += obj.get('notes')
self.api._update_state(data)
return obj