'organization-projects.ProjectProgramType',
'organization-projects.ProjectTopic',
'organization-projects.ProjectProgramType',
+ 'organization-projects.ProjectDemo',
+ 'organization-projects.Repository',
+ 'organization-projects.RepositorySystem',
)),
(_('Shop'), ('shop.Product',
'organization-shop.ProductList',
# a mode you'd pass directly to os.chmod.
FILE_UPLOAD_PERMISSIONS = 0o664
FILE_UPLOAD_TEMP_DIR = '/srv/media/uploads/tmp/'
+if not os.path.exists(FILE_UPLOAD_TEMP_DIR):
+ os.makedirs(FILE_UPLOAD_TEMP_DIR)
+
MAX_UPLOAD_SIZE = 512000000
MAX_UPLOAD_SIZE_FRONT = 10485760
FILEBROWSER_MAX_UPLOAD_SIZE = 512000000
SHOP_USE_RATINGS = False
PROJECT_DEMOS_DIR = '/srv/media/projects/demos/'
+if not os.path.exists(PROJECT_DEMOS_DIR):
+ os.makedirs(PROJECT_DEMOS_DIR)
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
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
model = ProjectFile
+class ProjectDemoInline(TabularDynamicInlineAdmin):
+
+ model = ProjectDemo
+
+
+class ProjectDemoAdmin(BaseTranslationModelAdmin):
+
+ model = ProjectDemo
+ filter_horizontal = ['authors']
+
+
class ProjectAdmin(admin.ModelAdmin):
model = Project
ProjectImageInline,
ProjectPlaylistInline,
ProjectLinkInline,
- ProjectFileInline]
+ ProjectFileInline,]
filter_horizontal = ['teams', 'organizations']
list_filter = ['type', 'program', 'program_type', ]
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)
+admin.site.register(ProjectDemo, ProjectDemoAdmin)
admin.site.register(Repository)
admin.site.register(RepositorySystem)
--- /dev/null
+[{"model": "organization-projects.repositorysystem", "pk": 2, "fields": {"description": "", "name": "Git", "clone_command": "git clone", "pull_command": "git pull", "checkout_command": "git checkout", "branch_command": "git branch"}}, {"model": "organization-projects.repositorysystem", "pk": 3, "fields": {"description": "", "name": "Mercurial", "clone_command": "hg clone", "pull_command": "hg pull", "checkout_command": "hg up", "branch_command": "hg branch"}}, {"model": "organization-projects.repositorysystem", "pk": 4, "fields": {"description": "", "name": "SVN", "clone_command": "svn co", "pull_command": "svn update", "checkout_command": "svn co", "branch_command": "svn copy"}}, {"model": "organization-projects.repositorysystem", "pk": 5, "fields": {"description": "", "name": "Bazaar", "clone_command": "bzr co", "pull_command": "bzr update", "checkout_command": "bzr co", "branch_command": "bzr branch"}}]
\ No newline at end of file
--- /dev/null
+# -*- coding: utf-8 -*-
+# Generated by Django 1.9.10 on 2016-11-03 17:25
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('organization-network', '0046_auto_20161026_1025'),
+ ('organization-projects', '0024_auto_20161103_1521'),
+ ]
+
+ operations = [
+ migrations.RemoveField(
+ model_name='projectdemo',
+ name='author',
+ ),
+ migrations.RemoveField(
+ model_name='projectdemo',
+ name='directory',
+ ),
+ migrations.RemoveField(
+ model_name='repositorysystem',
+ name='type',
+ ),
+ migrations.AddField(
+ model_name='projectdemo',
+ name='authors',
+ field=models.ManyToManyField(blank=True, related_name='demos', to='organization-network.Person', verbose_name='authors'),
+ ),
+ migrations.AddField(
+ model_name='projectdemo',
+ name='description_en',
+ field=models.TextField(blank=True, null=True, verbose_name='Description'),
+ ),
+ migrations.AddField(
+ model_name='projectdemo',
+ name='description_fr',
+ field=models.TextField(blank=True, null=True, verbose_name='Description'),
+ ),
+ migrations.AddField(
+ model_name='projectdemo',
+ name='title_en',
+ field=models.CharField(max_length=500, null=True, verbose_name='Title'),
+ ),
+ migrations.AddField(
+ model_name='projectdemo',
+ name='title_fr',
+ field=models.CharField(max_length=500, null=True, verbose_name='Title'),
+ ),
+ ]
from organization.core.models import *
from organization.pages.models import *
+from organization.network.models import *
PROJECT_TYPE_CHOICES = [
class ProjectDemo(Displayable, RichText):
project = models.ForeignKey('Project', verbose_name=_('project'), related_name='demos', blank=True, null=True, on_delete=models.SET_NULL)
- author = models.ForeignKey(User, verbose_name=_('author'), 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)
- directory = models.CharField(_('directory'), max_length=256, blank=True, null=True)
build_commands = models.TextField(_('build commands'), blank=True)
class Meta:
return reverse("organization-project-demo-detail", kwargs={"slug": self.slug})
def build(self):
- os.chdir(settings.PROJECT_DEMOS_DIR + os.sep + self.directory)
- for commands in self.build_commands.split('\n'):
+ 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):
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.system(' '.join((self.system.clone_command, self.url, settings.PROJECT_DEMOS_DIR)))
+ 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):
- type = models.CharField(_('type'), max_length=32)
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)
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
links:
- db
environment:
- - DEBUG=False
+ - DEBUG='False'
nginx:
image: nginx