From 2a3ccf7e306bbbfd5964b2c23f7c7516918e8976 Mon Sep 17 00:00:00 2001 From: Guillaume Pellerin Date: Thu, 3 Nov 2016 18:44:47 +0100 Subject: [PATCH] Merge feature/demos --- app/organization/core/models.py | 6 +- app/organization/projects/admin.py | 17 ++++- app/organization/projects/models.py | 86 ++++++++++++++++++++++++ app/organization/projects/translation.py | 6 ++ app/scripts/app.sh | 1 + docker-compose.yml | 2 +- lib/mezzanine-agenda | 2 +- 7 files changed, 114 insertions(+), 6 deletions(-) diff --git a/app/organization/core/models.py b/app/organization/core/models.py index a145a307..b077a4b1 100644 --- a/app/organization/core/models.py +++ b/app/organization/core/models.py @@ -26,10 +26,11 @@ class Description(models.Model): abstract = True -class Named(Description): +class Named(models.Model): """Abstract model providing a name field""" name = models.CharField(_('name'), max_length=512) + description = models.TextField(_('description'), blank=True) class Meta: abstract = True @@ -43,10 +44,11 @@ class Named(Description): return slugify(self.__unicode__()) -class Titled(Description): +class Titled(models.Model): """Abstract model providing a title field""" title = models.CharField(_('title'), max_length=1024) + description = models.TextField(_('description'), blank=True) class Meta: abstract = True diff --git a/app/organization/projects/admin.py b/app/organization/projects/admin.py index d507ca1b..9396727a 100644 --- a/app/organization/projects/admin.py +++ b/app/organization/projects/admin.py @@ -37,6 +37,17 @@ class ProjectFileInline(TabularDynamicInlineAdmin): model = ProjectFile +class ProjectDemoInline(TabularDynamicInlineAdmin): + + model = ProjectDemo + + +class ProjectDemoAdmin(BaseTranslationModelAdmin): + + model = ProjectDemo + filter_horizontal = ['authors'] + + class ProjectAdmin(admin.ModelAdmin): model = Project @@ -49,7 +60,7 @@ class ProjectAdminDisplayable(DisplayableAdmin): ProjectImageInline, ProjectPlaylistInline, ProjectLinkInline, - ProjectFileInline] + ProjectFileInline,] filter_horizontal = ['teams', 'organizations'] list_filter = ['type', 'program', 'program_type', ] @@ -74,9 +85,11 @@ class ProjectTopicPageAdmin(PageAdmin): inlines = [PageImageInline, ] - admin.site.register(Project, ProjectAdminDisplayable) admin.site.register(ProjectProgram, ProjectProgramAdmin) admin.site.register(ProjectProgramType, ProjectProgramTypeAdmin) admin.site.register(ProjectTopic, ProjectTopicAdmin) admin.site.register(ProjectTopicPage, ProjectTopicPageAdmin) +admin.site.register(ProjectDemo, ProjectDemoAdmin) +admin.site.register(Repository) +admin.site.register(RepositorySystem) diff --git a/app/organization/projects/models.py b/app/organization/projects/models.py index 2b6525e8..f960eac0 100644 --- a/app/organization/projects/models.py +++ b/app/organization/projects/models.py @@ -1,13 +1,16 @@ from __future__ import unicode_literals import datetime +import os from django.db import models from django.utils.translation import ugettext_lazy as _ +from django.contrib.auth.models import User from mezzanine.core.models import RichText, Displayable, Slugged, Orderable from organization.core.models import * from organization.pages.models import * +from organization.network.models import * PROJECT_TYPE_CHOICES = [ @@ -15,6 +18,13 @@ PROJECT_TYPE_CHOICES = [ ('external', _('external')), ] +ACCESS_CHOICES = [ + ('public', _('public')), + ('shared', _('shared')), + ('private', _('private')), +] + + class Project(Displayable, Period, RichText): """(Project description)""" @@ -30,6 +40,7 @@ class Project(Displayable, Period, RichText): class Meta: verbose_name = _('project') + verbose_name_plural = _("projects") ordering = ['-date_from', '-date_to'] def __str__(self): @@ -56,6 +67,7 @@ class ProjectTopic(Named): class Meta: verbose_name = _('project topic') + verbose_name_plural = _("project topics") ordering = ['name',] def __str__(self): @@ -69,6 +81,7 @@ class ProjectProgram(Named): class Meta: verbose_name = _('program') + verbose_name_plural = _("programs") ordering = ['name',] @@ -76,6 +89,7 @@ class ProjectProgramType(Named): class Meta: verbose_name = _('program type') + verbose_name_plural = _("program types") ordering = ['name',] @@ -101,6 +115,7 @@ class ProjectFile(File): class ProjectBlock(Block): + project = models.ForeignKey(Project, verbose_name=_('project'), related_name='blocks', blank=True, null=True, on_delete=models.SET_NULL) @@ -110,3 +125,74 @@ class ProjectTopicPage(Page, SubTitled): class Meta: verbose_name = _('project topic page') + verbose_name_plural = _("project topic pages") + + +class ProjectDemo(Displayable, RichText): + + project = models.ForeignKey('Project', verbose_name=_('project'), related_name='demos', blank=True, null=True, on_delete=models.SET_NULL) + authors = models.ManyToManyField(Person, verbose_name=_('authors'), related_name='demos', blank=True) + repository = models.ForeignKey('Repository', verbose_name=_('repository'), related_name='demos', blank=True, null=True, on_delete=models.SET_NULL) + build_commands = models.TextField(_('build commands'), blank=True) + + class Meta: + verbose_name = _('project demo') + verbose_name_plural = _("project demos") + + def get_absolute_url(self): + return reverse("organization-project-demo-detail", kwargs={"slug": self.slug}) + + def build(self): + os.chdir(self.repository.directory) + for command in self.build_commands.split('\n'): + os.system(command) + + def save(self, *args, **kwargs): + super(ProjectDemo, self).save(args, kwargs) + self.build() + + +class Repository(Named, URL): + + system = models.ForeignKey('RepositorySystem', verbose_name=_('system'), related_name='repositories') + access = models.CharField(_('access'), max_length=64, choices=ACCESS_CHOICES, default='private') + branch = models.CharField(_('branch'), max_length=32, default='master') + + class Meta: + verbose_name = _('repository') + verbose_name_plural = _("repositories") + + def save(self, *args, **kwargs): + super(Repository, self).save(args, kwargs) + if not os.path.exists(self.directory): + self.clone() + self.checkout() + + @property + def directory(self): + dir_name = self.url.split('/')[-1].split('.')[0] + return settings.PROJECT_DEMOS_DIR + os.sep + dir_name + + def clone(self): + os.chdir(settings.PROJECT_DEMOS_DIR) + os.system(' '.join((self.system.clone_command, self.url))) + + def pull(self): + os.chdir(self.directory) + os.system(' '.join((self.system.pull_command, self.branch))) + + def checkout(self): + os.chdir(self.directory) + os.system(' '.join((self.system.checkout_command, self.branch))) + + +class RepositorySystem(Named): + + clone_command = models.CharField(_('clone command'), max_length=256) + pull_command = models.CharField(_('pull command'), max_length=256) + checkout_command = models.CharField(_('checkout command'), max_length=256) + branch_command = models.CharField(_('branch command'), max_length=256) + + class Meta: + verbose_name = _('repository system') + verbose_name_plural = _("repository systems") diff --git a/app/organization/projects/translation.py b/app/organization/projects/translation.py index 5cf18d9d..8398acd6 100644 --- a/app/organization/projects/translation.py +++ b/app/organization/projects/translation.py @@ -61,3 +61,9 @@ class ProjectTopicTranslationOptions(TranslationOptions): class ProjectTopicPageTranslationOptions(TranslationOptions): fields = ('sub_title',) + + +@register(ProjectDemo) +class ProjectDemoTranslationOptions(TranslationOptions): + + fields = ('title', 'description',) diff --git a/app/scripts/app.sh b/app/scripts/app.sh index e5510f91..5fc880f2 100644 --- a/app/scripts/app.sh +++ b/app/scripts/app.sh @@ -38,6 +38,7 @@ python $manage migrate --noinput python $manage create-admin-user # @todo searching every fixtures file in each folder python $manage loaddata $app/organization/job/fixtures/organization-job.json +python $manage loaddata $app/organization/projects/fixtures/organization-projects-repositorysystems.json # app start if [ "$1" = "--runserver" ]; then diff --git a/docker-compose.yml b/docker-compose.yml index 66e895aa..569f682d 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -55,7 +55,7 @@ app: links: - db environment: - - DEBUG=False + - DEBUG='False' nginx: image: nginx diff --git a/lib/mezzanine-agenda b/lib/mezzanine-agenda index e5502e7d..312ec5c0 160000 --- a/lib/mezzanine-agenda +++ b/lib/mezzanine-agenda @@ -1 +1 @@ -Subproject commit e5502e7d68ebb062f09bf5387fd103fc0b0d2a9f +Subproject commit 312ec5c0d72c5a501041dbed8d93ee0f577dc0f2 -- 2.39.5