]> git.parisson.com Git - mezzo.git/commitdiff
Merge feature/demos
authorGuillaume Pellerin <guillaume.pellerin@ircam.fr>
Thu, 3 Nov 2016 17:44:47 +0000 (18:44 +0100)
committerGuillaume Pellerin <guillaume.pellerin@ircam.fr>
Thu, 3 Nov 2016 17:44:47 +0000 (18:44 +0100)
app/organization/core/models.py
app/organization/projects/admin.py
app/organization/projects/models.py
app/organization/projects/translation.py
app/scripts/app.sh
docker-compose.yml
lib/mezzanine-agenda

index a145a3076a492739a0b1937d6f65793310756fbe..b077a4b16232e0d6a76692ff269c063627721538 100644 (file)
@@ -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
index d507ca1bb4316976447f2214aa40af9841458013..9396727a0b60486695db5b3bc0bada5418509aff 100644 (file)
@@ -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)
index 2b6525e82de2c537e481c7a4f53ae20c302701e6..f960eac01b0318dacbdbaa6ded13ea7743b0620a 100644 (file)
@@ -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")
index 5cf18d9d392f9231acf2020de3e492af0d9a62bb..8398acd61644ec422c05d6c8a7aad34fffa5a2b4 100644 (file)
@@ -61,3 +61,9 @@ class ProjectTopicTranslationOptions(TranslationOptions):
 class ProjectTopicPageTranslationOptions(TranslationOptions):
 
     fields = ('sub_title',)
+
+
+@register(ProjectDemo)
+class ProjectDemoTranslationOptions(TranslationOptions):
+
+    fields = ('title', 'description',)
index e5510f918cf85255f21f2677f7f50393034abbb9..5fc880f2fb0a49e50daf7f0bc986e7e8f34ae916 100644 (file)
@@ -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
index 66e895aa2c70fdf56acda0202acf39aa520bcb6a..569f682d92f25c37749a5614b8561dca8bdd50ed 100644 (file)
@@ -55,7 +55,7 @@ app:
   links:
     - db
   environment:
-   - DEBUG=False
+   - DEBUG='False'
 
 nginx:
   image: nginx
index e5502e7d68ebb062f09bf5387fd103fc0b0d2a9f..312ec5c0d72c5a501041dbed8d93ee0f577dc0f2 160000 (submodule)
@@ -1 +1 @@
-Subproject commit e5502e7d68ebb062f09bf5387fd103fc0b0d2a9f
+Subproject commit 312ec5c0d72c5a501041dbed8d93ee0f577dc0f2