Blob Blame Raw

import exception
from generator.form import Form

from page.page import Page


class RepoCreatePage(Page):
  def process(self, request, path, prevpath):
    user = request.answer.objects['user']
    if path:
      raise exception.HttpNotFound()
    if not request.model.repositories.can_create(user.id):
      raise exception.HttpNotFound()
    answer = request.answer
    answer.add_uipath_entry( answer.t('Create repository'), prevpath )
    
    form = Form(request)
    form.begin('', 'repo.create')
    form.add_hidden('user_id', user.id)
    form.add_select('type:', 'type', { k: v.name for k, v in request.server.repotypes.items() })
    form.add_input('name:', 'name', 'text')
    form.add_input('title:', 'title', 'text')
    form.add_textarea('description:', 'description')
    form.add_submit()
    form.end()
    answer.content += form.content
    
    return answer.complete_content()


class RepoPage(Page):
  def __init__(self):
    super().__init__()
    self.view = RepoViewPage()
    
  def process(self, request, path, prevpath):
    if not path:
      raise exception.HttpNotFound()

    answer = request.answer

    user = request.answer.objects['user']
    repo = request.model.repositories.get_by_name(user.id, str(path[0]), user)
    if not repo:
      raise exception.HttpNotFound()

    answer.objects['repo'] = repo
    answer.add_uipath_entry( repo.title, prevpath + [repo.name] )
    return self.view.sub_process(request, path, prevpath)


class RepoViewPage(Page):
  def __init__(self):
    super().__init__()
    self.edit = RepoUpdatePage()
    self.delete = RepoDeletePage()

  def process(self, request, path, prevpath):
    repo = request.answer.objects['repo']
    
    answer = request.answer

    if path:
      if path[0] == 'edit':
        return self.edit.sub_process(request, path, prevpath)
      if path[0] == 'delete':
        return self.delete.sub_process(request, path, prevpath)
      raise exception.HttpNotFound()

    answer.content += '<p>' + answer.te(repo.repotype.name) + '</p>\n'
    answer.content += '<p>' + answer.e(repo.name) + '</p>\n'
    answer.content += '<p>' + answer.e(repo.description) + '</p>\n'
    answer.content += '<p>' + answer.te('clone url:') + ' ' \
                    + request.protocol \
                    + request.domain \
                    + '/repo/' \
                    + repo.gen_subpath() \
                    + '</p>\n'

    if repo.can_update():
      answer.content += '<p>' + self.make_link(answer, prevpath + ['edit'], 'Edit repository') + '</p>\n'

    return answer.complete_content()


class RepoUpdatePage(Page):
  def process(self, request, path, prevpath):
    if path:
      raise exception.HttpNotFound()

    answer = request.answer
    repo = answer.objects['repo']
    if not repo.can_update():
      raise exception.HttpNotFound()
    
    answer.add_uipath_entry( answer.t('Edit repository') )
    
    form = Form(request)
    form.begin('Details', 'repo.update')
    form.add_hidden('repository_id', repo.id)
    form.add_input('title:', 'title', 'text', repo.title)
    form.add_textarea('description:', 'description', repo.description)
    form.add_submit()
    form.end()
    answer.content += form.content
    
    
    if repo.can_delete() and prevpath:
      url = request.get_urlpath_escaped(prevpath[:-1] + ['delete'])
      form = Form(request)
      form.content += '<form method="GET" action="' + url + '">' + form.GROUP_BEGIN
      form.content += form.title('Deletion')
      form.add_submit('Delete repository')
      form.end()
      answer.content += form.content

    return answer.complete_content()


class RepoDeletePage(Page):
  def process(self, request, path, prevpath):
    if path:
      raise exception.HttpNotFound()

    answer = request.answer
    repo = answer.objects['repo']
    if not repo.can_delete():
      raise exception.HttpNotFound()

    answer.add_uipath_entry( answer.t('Delete repository'), prevpath )

    form = Form(request)
    form.begin('', 'repo.delete')
    form.add_hidden('repository_id', repo.id)
    form.content += '<p>' + answer.te(repo.repotype.name) + '</p>\n'
    form.content += '<p>' + answer.e(repo.name) + '</p>\n'
    form.content += '<p>' + answer.e(repo.title) + '</p>\n'
    form.content += '<p>' + answer.e(repo.description) + '</p>\n'
    form.content += '<p>' + answer.e(repo.description) + '</p>\n'
    form.content += '<p>' + request.protocol + request.domain + '/repo/' + repo.gen_subpath() + '</p>\n'
    form.content += '<p>' + answer.te('Do you really want do delete repository?') + '</p>\n'
    form.add_submit('Confirm delete')
    form.end()
    answer.content += form.content

    return answer.complete_content()


class RepoListPage(Page):
  def process(self, request, path, prevpath):
    user = request.answer.objects['user']
    if path:
      raise exception.HttpNotFound()
    if not prevpath:
      raise exception.HttpNotFound()
    
    repositories = request.model.repositories.get_list(user)
    
    answer = request.answer
    answer.add_uipath_entry( answer.t('Repositories'), prevpath )
    
    for repo in repositories:
      url = request.get_urlpath_escaped(prevpath[:-1] + ['repo', str(repo.name)])
      answer.content += '<p><a href="' + url + '">' \
                     + answer.e(repo.name) + ' ' \
                     + answer.e(repo.title) + '</a></p>\n'

    if request.model.repositories.can_create(user.id):
      answer.content += '<p>' + self.make_link(answer, prevpath[:-1] + ['repo_create'], 'Create repository') + '</p>\n'

    return answer.complete_content()