work on website
This commit is contained in:
		@ -36,8 +36,8 @@ class PageDiffusionPlaylist(UnrelatedInlineMixin, TracksInline):
 | 
				
			|||||||
        view_obj.save()
 | 
					        view_obj.save()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@admin.register(models.Article)
 | 
					@admin.register(models.Page)
 | 
				
			||||||
class ArticleAdmin(ContentEditor):
 | 
					class PageAdmin(ContentEditor):
 | 
				
			||||||
    fieldsets = (
 | 
					    fieldsets = (
 | 
				
			||||||
        (_('Main'), {
 | 
					        (_('Main'), {
 | 
				
			||||||
            'fields': ['title', 'slug', 'cover', 'headline'],
 | 
					            'fields': ['title', 'slug', 'cover', 'headline'],
 | 
				
			||||||
@ -48,19 +48,19 @@ class ArticleAdmin(ContentEditor):
 | 
				
			|||||||
            'classes': ('tabbed',)
 | 
					            'classes': ('tabbed',)
 | 
				
			||||||
        }),
 | 
					        }),
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
    list_display = ["title", "parent", "status"]
 | 
					    list_display = ["title", "status", "slug"]
 | 
				
			||||||
    list_editable = ['status']
 | 
					    list_editable = ['status']
 | 
				
			||||||
    prepopulated_fields = {"slug": ("title",)}
 | 
					    prepopulated_fields = {"slug": ("title",)}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    inlines = [
 | 
					    inlines = [
 | 
				
			||||||
        ContentEditorInline.create(models.ArticleRichText),
 | 
					        ContentEditorInline.create(models.PageRichText),
 | 
				
			||||||
        ContentEditorInline.create(models.ArticleImage),
 | 
					        ContentEditorInline.create(models.PageImage),
 | 
				
			||||||
    ]
 | 
					    ]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@admin.register(models.DiffusionPage)
 | 
					@admin.register(models.DiffusionPage)
 | 
				
			||||||
class DiffusionPageAdmin(ArticleAdmin):
 | 
					class DiffusionPageAdmin(PageAdmin):
 | 
				
			||||||
    fieldsets = copy.deepcopy(ArticleAdmin.fieldsets)
 | 
					    fieldsets = copy.deepcopy(PageAdmin.fieldsets)
 | 
				
			||||||
    fieldsets[1][1]['fields'].insert(0, 'diffusion')
 | 
					    fieldsets[1][1]['fields'].insert(0, 'diffusion')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # TODO: permissions
 | 
					    # TODO: permissions
 | 
				
			||||||
@ -72,8 +72,10 @@ class DiffusionPageAdmin(ArticleAdmin):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@admin.register(models.ProgramPage)
 | 
					@admin.register(models.ProgramPage)
 | 
				
			||||||
class ProgramPageAdmin(ArticleAdmin):
 | 
					class ProgramPageAdmin(PageAdmin):
 | 
				
			||||||
    fieldsets = copy.deepcopy(ArticleAdmin.fieldsets)
 | 
					    fieldsets = copy.deepcopy(PageAdmin.fieldsets)
 | 
				
			||||||
    fieldsets[1][1]['fields'].insert(0, 'program')
 | 
					    fieldsets[1][1]['fields'].insert(0, 'program')
 | 
				
			||||||
 | 
					    prepopulated_fields = {}
 | 
				
			||||||
 | 
					    readonly_fields = ['slug']
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -37,16 +37,34 @@ $body-background-color: $light;
 | 
				
			|||||||
        padding: 0.2em 0em;
 | 
					        padding: 0.2em 0em;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    .cover {
 | 
					 | 
				
			||||||
        float: right;
 | 
					 | 
				
			||||||
        max-width: 40%;
 | 
					 | 
				
			||||||
        margin: 1em;
 | 
					 | 
				
			||||||
        border: 0.2em black solid;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    p {
 | 
					    p {
 | 
				
			||||||
        padding: 0.4em 0em;
 | 
					        padding: 0.4em 0em;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.cover {
 | 
				
			||||||
 | 
					    margin: 1em 0em;
 | 
				
			||||||
 | 
					    border: 0.2em black solid;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.small-cover {
 | 
				
			||||||
 | 
					    width: 10em;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					aside {
 | 
				
			||||||
 | 
					    .small-cover {
 | 
				
			||||||
 | 
					        width: 4em;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    .media .subtitle {
 | 
				
			||||||
 | 
					        font-size: 1em;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    .media .content {
 | 
				
			||||||
 | 
					        display: none;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -98,23 +98,43 @@ class Page(StatusModel):
 | 
				
			|||||||
    Page parenting is based on foreignkey to parent and page path.
 | 
					    Page parenting is based on foreignkey to parent and page path.
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
    STATUS = Choices('draft', 'published', 'trash')
 | 
					    STATUS = Choices('draft', 'published', 'trash')
 | 
				
			||||||
 | 
					    regions = [
 | 
				
			||||||
 | 
					        Region(key="content", title=_("Content")),
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    parent = models.ForeignKey(
 | 
					 | 
				
			||||||
        'self', models.CASCADE,
 | 
					 | 
				
			||||||
        verbose_name=_('parent page'),
 | 
					 | 
				
			||||||
        blank=True, null=True,
 | 
					 | 
				
			||||||
    )
 | 
					 | 
				
			||||||
    title = models.CharField(max_length=128)
 | 
					    title = models.CharField(max_length=128)
 | 
				
			||||||
    slug = models.SlugField(_('slug'))
 | 
					    slug = models.SlugField(_('slug'), blank=True, unique=True)
 | 
				
			||||||
    headline = models.TextField(
 | 
					    headline = models.TextField(
 | 
				
			||||||
        _('headline'), max_length=128, blank=True, null=True,
 | 
					        _('headline'), max_length=128, blank=True, null=True,
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # content
 | 
				
			||||||
 | 
					    as_program = models.ForeignKey(
 | 
				
			||||||
 | 
					        aircox.Program, models.SET_NULL, blank=True, null=True,
 | 
				
			||||||
 | 
					        related_name='+',
 | 
				
			||||||
 | 
					        # SO#51948640
 | 
				
			||||||
 | 
					        # limit_choices_to={'schedule__isnull': False},
 | 
				
			||||||
 | 
					        verbose_name=_('Show program as author'),
 | 
				
			||||||
 | 
					        help_text=_("Show program as author"),
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    cover = FilerImageField(
 | 
				
			||||||
 | 
					        on_delete=models.SET_NULL, null=True, blank=True,
 | 
				
			||||||
 | 
					        verbose_name=_('Cover'),
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # options
 | 
				
			||||||
 | 
					    featured = models.BooleanField(
 | 
				
			||||||
 | 
					        _('featured'), default=False,
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    allow_comments = models.BooleanField(
 | 
				
			||||||
 | 
					        _('allow comments'), default=True,
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    objects = PageQueryset.as_manager()
 | 
					    objects = PageQueryset.as_manager()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @property
 | 
					    @property
 | 
				
			||||||
    def path(self):
 | 
					    def path(self):
 | 
				
			||||||
        return reverse('page', kwargs={'slug': self.slug})
 | 
					        return reverse(self.detail_url_name, kwargs={'slug': self.slug})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def get_view_class(self):
 | 
					    def get_view_class(self):
 | 
				
			||||||
        """ Page view class"""
 | 
					        """ Page view class"""
 | 
				
			||||||
@ -130,39 +150,9 @@ class Page(StatusModel):
 | 
				
			|||||||
                               self.title or self.pk)
 | 
					                               self.title or self.pk)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Article(Page):
 | 
					class DiffusionPage(Page):
 | 
				
			||||||
    """ User's pages """
 | 
					    detail_url_name = 'diffusion-page'
 | 
				
			||||||
    regions = [
 | 
					 | 
				
			||||||
        Region(key="content", title=_("Content")),
 | 
					 | 
				
			||||||
    ]
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # metadata
 | 
					 | 
				
			||||||
    as_program = models.ForeignKey(
 | 
					 | 
				
			||||||
        aircox.Program, models.SET_NULL, blank=True, null=True,
 | 
					 | 
				
			||||||
        related_name='+',
 | 
					 | 
				
			||||||
        # SO#51948640
 | 
					 | 
				
			||||||
        # limit_choices_to={'schedule__isnull': False},
 | 
					 | 
				
			||||||
        verbose_name=_('Show program as author'),
 | 
					 | 
				
			||||||
        help_text=_("Show program as author"),
 | 
					 | 
				
			||||||
    )
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    # options
 | 
					 | 
				
			||||||
    featured = models.BooleanField(
 | 
					 | 
				
			||||||
        _('featured'), default=False,
 | 
					 | 
				
			||||||
    )
 | 
					 | 
				
			||||||
    allow_comments = models.BooleanField(
 | 
					 | 
				
			||||||
        _('allow comments'), default=True,
 | 
					 | 
				
			||||||
    )
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    # content
 | 
					 | 
				
			||||||
    cover = FilerImageField(
 | 
					 | 
				
			||||||
        on_delete=models.SET_NULL, null=True, blank=True,
 | 
					 | 
				
			||||||
        verbose_name=_('Cover'),
 | 
					 | 
				
			||||||
    )
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class DiffusionPage(Article):
 | 
					 | 
				
			||||||
    diffusion = models.OneToOneField(
 | 
					    diffusion = models.OneToOneField(
 | 
				
			||||||
        aircox.Diffusion, models.CASCADE,
 | 
					        aircox.Diffusion, models.CASCADE,
 | 
				
			||||||
        related_name='page',
 | 
					        related_name='page',
 | 
				
			||||||
@ -173,8 +163,23 @@ class DiffusionPage(Article):
 | 
				
			|||||||
    def path(self):
 | 
					    def path(self):
 | 
				
			||||||
        return reverse('diffusion-page', kwargs={'slug': self.slug})
 | 
					        return reverse('diffusion-page', kwargs={'slug': self.slug})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def save(self, *args, **kwargs):
 | 
				
			||||||
 | 
					        program = self.diffusion.program
 | 
				
			||||||
 | 
					        self.as_program = self.diffusion.program
 | 
				
			||||||
 | 
					        if not self.slug.startswith(program.slug + '-'):
 | 
				
			||||||
 | 
					            self.slug = '{}-{}'.format(program.slug, self.slug)
 | 
				
			||||||
 | 
					        return super().save(*args, **kwargs)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class ProgramPage(Article):
 | 
					
 | 
				
			||||||
 | 
					def get_diffusions_with_page(queryset=aircox.Diffusion.objects,
 | 
				
			||||||
 | 
					                             status=Page.STATUS.published):
 | 
				
			||||||
 | 
					    return queryset.filter(Q(page__isnull=True) |
 | 
				
			||||||
 | 
					                           Q(initial__page__isnull=True),
 | 
				
			||||||
 | 
					                           Q(page__status=status) |
 | 
				
			||||||
 | 
					                           Q(initial__page__status=status))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class ProgramPage(Page):
 | 
				
			||||||
    detail_url_name = 'program-page'
 | 
					    detail_url_name = 'program-page'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    program = models.OneToOneField(
 | 
					    program = models.OneToOneField(
 | 
				
			||||||
@ -186,14 +191,18 @@ class ProgramPage(Article):
 | 
				
			|||||||
    def path(self):
 | 
					    def path(self):
 | 
				
			||||||
        return reverse('program-page', kwargs={'slug': self.slug})
 | 
					        return reverse('program-page', kwargs={'slug': self.slug})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def save(self, *args, **kwargs):
 | 
				
			||||||
 | 
					        self.slug = self.program.slug
 | 
				
			||||||
 | 
					        return super().save(*args, **kwargs)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#-----------------------------------------------------------------------
 | 
					#-----------------------------------------------------------------------
 | 
				
			||||||
ArticlePlugin = create_plugin_base(Article)
 | 
					PagePlugin = create_plugin_base(Page)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class ArticleRichText(plugins.RichText, ArticlePlugin):
 | 
					class PageRichText(plugins.RichText, PagePlugin):
 | 
				
			||||||
    pass
 | 
					    pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class ArticleImage(plugins.Image, ArticlePlugin):
 | 
					class PageImage(plugins.Image, PagePlugin):
 | 
				
			||||||
    pass
 | 
					    pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -13,6 +13,6 @@ site_renderer.register(SiteLink, lambda plugin: plugin.render())
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
page_renderer = PluginRenderer()
 | 
					page_renderer = PluginRenderer()
 | 
				
			||||||
page_renderer._renderers.clear()
 | 
					page_renderer._renderers.clear()
 | 
				
			||||||
page_renderer.register(ArticleRichText, lambda plugin: mark_safe(plugin.text))
 | 
					page_renderer.register(PageRichText, lambda plugin: mark_safe(plugin.text))
 | 
				
			||||||
page_renderer.register(ArticleImage, lambda plugin: plugin.render())
 | 
					page_renderer.register(PageImage, lambda plugin: plugin.render())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										7197
									
								
								aircox_web/static/aircox_web/assets/main.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7197
									
								
								aircox_web/static/aircox_web/assets/main.css
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										347
									
								
								aircox_web/static/aircox_web/assets/main.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										347
									
								
								aircox_web/static/aircox_web/assets/main.js
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,347 @@
 | 
				
			|||||||
 | 
					/******/ (function(modules) { // webpackBootstrap
 | 
				
			||||||
 | 
					/******/ 	// install a JSONP callback for chunk loading
 | 
				
			||||||
 | 
					/******/ 	function webpackJsonpCallback(data) {
 | 
				
			||||||
 | 
					/******/ 		var chunkIds = data[0];
 | 
				
			||||||
 | 
					/******/ 		var moreModules = data[1];
 | 
				
			||||||
 | 
					/******/ 		var executeModules = data[2];
 | 
				
			||||||
 | 
					/******/
 | 
				
			||||||
 | 
					/******/ 		// add "moreModules" to the modules object,
 | 
				
			||||||
 | 
					/******/ 		// then flag all "chunkIds" as loaded and fire callback
 | 
				
			||||||
 | 
					/******/ 		var moduleId, chunkId, i = 0, resolves = [];
 | 
				
			||||||
 | 
					/******/ 		for(;i < chunkIds.length; i++) {
 | 
				
			||||||
 | 
					/******/ 			chunkId = chunkIds[i];
 | 
				
			||||||
 | 
					/******/ 			if(installedChunks[chunkId]) {
 | 
				
			||||||
 | 
					/******/ 				resolves.push(installedChunks[chunkId][0]);
 | 
				
			||||||
 | 
					/******/ 			}
 | 
				
			||||||
 | 
					/******/ 			installedChunks[chunkId] = 0;
 | 
				
			||||||
 | 
					/******/ 		}
 | 
				
			||||||
 | 
					/******/ 		for(moduleId in moreModules) {
 | 
				
			||||||
 | 
					/******/ 			if(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {
 | 
				
			||||||
 | 
					/******/ 				modules[moduleId] = moreModules[moduleId];
 | 
				
			||||||
 | 
					/******/ 			}
 | 
				
			||||||
 | 
					/******/ 		}
 | 
				
			||||||
 | 
					/******/ 		if(parentJsonpFunction) parentJsonpFunction(data);
 | 
				
			||||||
 | 
					/******/
 | 
				
			||||||
 | 
					/******/ 		while(resolves.length) {
 | 
				
			||||||
 | 
					/******/ 			resolves.shift()();
 | 
				
			||||||
 | 
					/******/ 		}
 | 
				
			||||||
 | 
					/******/
 | 
				
			||||||
 | 
					/******/ 		// add entry modules from loaded chunk to deferred list
 | 
				
			||||||
 | 
					/******/ 		deferredModules.push.apply(deferredModules, executeModules || []);
 | 
				
			||||||
 | 
					/******/
 | 
				
			||||||
 | 
					/******/ 		// run deferred modules when all chunks ready
 | 
				
			||||||
 | 
					/******/ 		return checkDeferredModules();
 | 
				
			||||||
 | 
					/******/ 	};
 | 
				
			||||||
 | 
					/******/ 	function checkDeferredModules() {
 | 
				
			||||||
 | 
					/******/ 		var result;
 | 
				
			||||||
 | 
					/******/ 		for(var i = 0; i < deferredModules.length; i++) {
 | 
				
			||||||
 | 
					/******/ 			var deferredModule = deferredModules[i];
 | 
				
			||||||
 | 
					/******/ 			var fulfilled = true;
 | 
				
			||||||
 | 
					/******/ 			for(var j = 1; j < deferredModule.length; j++) {
 | 
				
			||||||
 | 
					/******/ 				var depId = deferredModule[j];
 | 
				
			||||||
 | 
					/******/ 				if(installedChunks[depId] !== 0) fulfilled = false;
 | 
				
			||||||
 | 
					/******/ 			}
 | 
				
			||||||
 | 
					/******/ 			if(fulfilled) {
 | 
				
			||||||
 | 
					/******/ 				deferredModules.splice(i--, 1);
 | 
				
			||||||
 | 
					/******/ 				result = __webpack_require__(__webpack_require__.s = deferredModule[0]);
 | 
				
			||||||
 | 
					/******/ 			}
 | 
				
			||||||
 | 
					/******/ 		}
 | 
				
			||||||
 | 
					/******/
 | 
				
			||||||
 | 
					/******/ 		return result;
 | 
				
			||||||
 | 
					/******/ 	}
 | 
				
			||||||
 | 
					/******/
 | 
				
			||||||
 | 
					/******/ 	// The module cache
 | 
				
			||||||
 | 
					/******/ 	var installedModules = {};
 | 
				
			||||||
 | 
					/******/
 | 
				
			||||||
 | 
					/******/ 	// object to store loaded and loading chunks
 | 
				
			||||||
 | 
					/******/ 	// undefined = chunk not loaded, null = chunk preloaded/prefetched
 | 
				
			||||||
 | 
					/******/ 	// Promise = chunk loading, 0 = chunk loaded
 | 
				
			||||||
 | 
					/******/ 	var installedChunks = {
 | 
				
			||||||
 | 
					/******/ 		"main": 0
 | 
				
			||||||
 | 
					/******/ 	};
 | 
				
			||||||
 | 
					/******/
 | 
				
			||||||
 | 
					/******/ 	var deferredModules = [];
 | 
				
			||||||
 | 
					/******/
 | 
				
			||||||
 | 
					/******/ 	// The require function
 | 
				
			||||||
 | 
					/******/ 	function __webpack_require__(moduleId) {
 | 
				
			||||||
 | 
					/******/
 | 
				
			||||||
 | 
					/******/ 		// Check if module is in cache
 | 
				
			||||||
 | 
					/******/ 		if(installedModules[moduleId]) {
 | 
				
			||||||
 | 
					/******/ 			return installedModules[moduleId].exports;
 | 
				
			||||||
 | 
					/******/ 		}
 | 
				
			||||||
 | 
					/******/ 		// Create a new module (and put it into the cache)
 | 
				
			||||||
 | 
					/******/ 		var module = installedModules[moduleId] = {
 | 
				
			||||||
 | 
					/******/ 			i: moduleId,
 | 
				
			||||||
 | 
					/******/ 			l: false,
 | 
				
			||||||
 | 
					/******/ 			exports: {}
 | 
				
			||||||
 | 
					/******/ 		};
 | 
				
			||||||
 | 
					/******/
 | 
				
			||||||
 | 
					/******/ 		// Execute the module function
 | 
				
			||||||
 | 
					/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
 | 
				
			||||||
 | 
					/******/
 | 
				
			||||||
 | 
					/******/ 		// Flag the module as loaded
 | 
				
			||||||
 | 
					/******/ 		module.l = true;
 | 
				
			||||||
 | 
					/******/
 | 
				
			||||||
 | 
					/******/ 		// Return the exports of the module
 | 
				
			||||||
 | 
					/******/ 		return module.exports;
 | 
				
			||||||
 | 
					/******/ 	}
 | 
				
			||||||
 | 
					/******/
 | 
				
			||||||
 | 
					/******/
 | 
				
			||||||
 | 
					/******/ 	// expose the modules object (__webpack_modules__)
 | 
				
			||||||
 | 
					/******/ 	__webpack_require__.m = modules;
 | 
				
			||||||
 | 
					/******/
 | 
				
			||||||
 | 
					/******/ 	// expose the module cache
 | 
				
			||||||
 | 
					/******/ 	__webpack_require__.c = installedModules;
 | 
				
			||||||
 | 
					/******/
 | 
				
			||||||
 | 
					/******/ 	// define getter function for harmony exports
 | 
				
			||||||
 | 
					/******/ 	__webpack_require__.d = function(exports, name, getter) {
 | 
				
			||||||
 | 
					/******/ 		if(!__webpack_require__.o(exports, name)) {
 | 
				
			||||||
 | 
					/******/ 			Object.defineProperty(exports, name, { enumerable: true, get: getter });
 | 
				
			||||||
 | 
					/******/ 		}
 | 
				
			||||||
 | 
					/******/ 	};
 | 
				
			||||||
 | 
					/******/
 | 
				
			||||||
 | 
					/******/ 	// define __esModule on exports
 | 
				
			||||||
 | 
					/******/ 	__webpack_require__.r = function(exports) {
 | 
				
			||||||
 | 
					/******/ 		if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
 | 
				
			||||||
 | 
					/******/ 			Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
 | 
				
			||||||
 | 
					/******/ 		}
 | 
				
			||||||
 | 
					/******/ 		Object.defineProperty(exports, '__esModule', { value: true });
 | 
				
			||||||
 | 
					/******/ 	};
 | 
				
			||||||
 | 
					/******/
 | 
				
			||||||
 | 
					/******/ 	// create a fake namespace object
 | 
				
			||||||
 | 
					/******/ 	// mode & 1: value is a module id, require it
 | 
				
			||||||
 | 
					/******/ 	// mode & 2: merge all properties of value into the ns
 | 
				
			||||||
 | 
					/******/ 	// mode & 4: return value when already ns object
 | 
				
			||||||
 | 
					/******/ 	// mode & 8|1: behave like require
 | 
				
			||||||
 | 
					/******/ 	__webpack_require__.t = function(value, mode) {
 | 
				
			||||||
 | 
					/******/ 		if(mode & 1) value = __webpack_require__(value);
 | 
				
			||||||
 | 
					/******/ 		if(mode & 8) return value;
 | 
				
			||||||
 | 
					/******/ 		if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
 | 
				
			||||||
 | 
					/******/ 		var ns = Object.create(null);
 | 
				
			||||||
 | 
					/******/ 		__webpack_require__.r(ns);
 | 
				
			||||||
 | 
					/******/ 		Object.defineProperty(ns, 'default', { enumerable: true, value: value });
 | 
				
			||||||
 | 
					/******/ 		if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
 | 
				
			||||||
 | 
					/******/ 		return ns;
 | 
				
			||||||
 | 
					/******/ 	};
 | 
				
			||||||
 | 
					/******/
 | 
				
			||||||
 | 
					/******/ 	// getDefaultExport function for compatibility with non-harmony modules
 | 
				
			||||||
 | 
					/******/ 	__webpack_require__.n = function(module) {
 | 
				
			||||||
 | 
					/******/ 		var getter = module && module.__esModule ?
 | 
				
			||||||
 | 
					/******/ 			function getDefault() { return module['default']; } :
 | 
				
			||||||
 | 
					/******/ 			function getModuleExports() { return module; };
 | 
				
			||||||
 | 
					/******/ 		__webpack_require__.d(getter, 'a', getter);
 | 
				
			||||||
 | 
					/******/ 		return getter;
 | 
				
			||||||
 | 
					/******/ 	};
 | 
				
			||||||
 | 
					/******/
 | 
				
			||||||
 | 
					/******/ 	// Object.prototype.hasOwnProperty.call
 | 
				
			||||||
 | 
					/******/ 	__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
 | 
				
			||||||
 | 
					/******/
 | 
				
			||||||
 | 
					/******/ 	// __webpack_public_path__
 | 
				
			||||||
 | 
					/******/ 	__webpack_require__.p = "";
 | 
				
			||||||
 | 
					/******/
 | 
				
			||||||
 | 
					/******/ 	var jsonpArray = window["webpackJsonp"] = window["webpackJsonp"] || [];
 | 
				
			||||||
 | 
					/******/ 	var oldJsonpFunction = jsonpArray.push.bind(jsonpArray);
 | 
				
			||||||
 | 
					/******/ 	jsonpArray.push = webpackJsonpCallback;
 | 
				
			||||||
 | 
					/******/ 	jsonpArray = jsonpArray.slice();
 | 
				
			||||||
 | 
					/******/ 	for(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);
 | 
				
			||||||
 | 
					/******/ 	var parentJsonpFunction = oldJsonpFunction;
 | 
				
			||||||
 | 
					/******/
 | 
				
			||||||
 | 
					/******/
 | 
				
			||||||
 | 
					/******/ 	// add entry module to deferred list
 | 
				
			||||||
 | 
					/******/ 	deferredModules.push(["./assets/index.js","vendor"]);
 | 
				
			||||||
 | 
					/******/ 	// run deferred modules when ready
 | 
				
			||||||
 | 
					/******/ 	return checkDeferredModules();
 | 
				
			||||||
 | 
					/******/ })
 | 
				
			||||||
 | 
					/************************************************************************/
 | 
				
			||||||
 | 
					/******/ ({
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/***/ "./assets/index.js":
 | 
				
			||||||
 | 
					/*!*************************!*\
 | 
				
			||||||
 | 
					  !*** ./assets/index.js ***!
 | 
				
			||||||
 | 
					  \*************************/
 | 
				
			||||||
 | 
					/*! no exports provided */
 | 
				
			||||||
 | 
					/*! all exports used */
 | 
				
			||||||
 | 
					/***/ (function(module, __webpack_exports__, __webpack_require__) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"use strict";
 | 
				
			||||||
 | 
					eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./js */ \"./assets/js/index.js\");\n/* harmony import */ var _styles_scss__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./styles.scss */ \"./assets/styles.scss\");\n/* harmony import */ var _styles_scss__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_styles_scss__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _noscript_scss__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./noscript.scss */ \"./assets/noscript.scss\");\n/* harmony import */ var _noscript_scss__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_noscript_scss__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./vue */ \"./assets/vue/index.js\");\n\n\n\n\n\n\n\n//# sourceURL=webpack:///./assets/index.js?");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/***/ }),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/***/ "./assets/js/index.js":
 | 
				
			||||||
 | 
					/*!****************************!*\
 | 
				
			||||||
 | 
					  !*** ./assets/js/index.js ***!
 | 
				
			||||||
 | 
					  \****************************/
 | 
				
			||||||
 | 
					/*! no exports provided */
 | 
				
			||||||
 | 
					/***/ (function(module, __webpack_exports__, __webpack_require__) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"use strict";
 | 
				
			||||||
 | 
					eval("/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.esm.browser.js\");\n/* harmony import */ var buefy__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! buefy */ \"./node_modules/buefy/dist/buefy.js\");\n/* harmony import */ var buefy__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(buefy__WEBPACK_IMPORTED_MODULE_1__);\n\n\n\nvue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].use(buefy__WEBPACK_IMPORTED_MODULE_1___default.a);\n\nwindow.addEventListener('load', () => {\n    var app = new vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"]({\n      el: '#app',\n      delimiters: [ '[[', ']]' ],\n    })\n});\n\n\n\n\n\n//# sourceURL=webpack:///./assets/js/index.js?");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/***/ }),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/***/ "./assets/noscript.scss":
 | 
				
			||||||
 | 
					/*!******************************!*\
 | 
				
			||||||
 | 
					  !*** ./assets/noscript.scss ***!
 | 
				
			||||||
 | 
					  \******************************/
 | 
				
			||||||
 | 
					/*! no static exports found */
 | 
				
			||||||
 | 
					/***/ (function(module, exports, __webpack_require__) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					eval("// extracted by mini-css-extract-plugin\n\n//# sourceURL=webpack:///./assets/noscript.scss?");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/***/ }),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/***/ "./assets/styles.scss":
 | 
				
			||||||
 | 
					/*!****************************!*\
 | 
				
			||||||
 | 
					  !*** ./assets/styles.scss ***!
 | 
				
			||||||
 | 
					  \****************************/
 | 
				
			||||||
 | 
					/*! no static exports found */
 | 
				
			||||||
 | 
					/***/ (function(module, exports, __webpack_require__) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					eval("// extracted by mini-css-extract-plugin\n\n//# sourceURL=webpack:///./assets/styles.scss?");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/***/ }),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/***/ "./assets/vue/index.js":
 | 
				
			||||||
 | 
					/*!*****************************!*\
 | 
				
			||||||
 | 
					  !*** ./assets/vue/index.js ***!
 | 
				
			||||||
 | 
					  \*****************************/
 | 
				
			||||||
 | 
					/*! exports provided: Tab, Tabs */
 | 
				
			||||||
 | 
					/***/ (function(module, __webpack_exports__, __webpack_require__) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"use strict";
 | 
				
			||||||
 | 
					eval("/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.esm.browser.js\");\n/* harmony import */ var _tab_vue__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./tab.vue */ \"./assets/vue/tab.vue\");\n/* harmony import */ var _tabs_vue__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tabs.vue */ \"./assets/vue/tabs.vue\");\n\n\n\n\n\nvue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].component('a-tab', _tab_vue__WEBPACK_IMPORTED_MODULE_1__[/* default */ \"a\"]);\nvue__WEBPACK_IMPORTED_MODULE_0__[\"default\"].component('a-tabs', _tabs_vue__WEBPACK_IMPORTED_MODULE_2__[/* default */ \"a\"]);\n\n\n\n\n\n\n//# sourceURL=webpack:///./assets/vue/index.js?");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/***/ }),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/***/ "./assets/vue/tab.vue":
 | 
				
			||||||
 | 
					/*!****************************!*\
 | 
				
			||||||
 | 
					  !*** ./assets/vue/tab.vue ***!
 | 
				
			||||||
 | 
					  \****************************/
 | 
				
			||||||
 | 
					/*! exports provided: default */
 | 
				
			||||||
 | 
					/*! exports used: default */
 | 
				
			||||||
 | 
					/***/ (function(module, __webpack_exports__, __webpack_require__) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"use strict";
 | 
				
			||||||
 | 
					eval("/* harmony import */ var _tab_vue_vue_type_template_id_65401e0e___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./tab.vue?vue&type=template&id=65401e0e& */ \"./assets/vue/tab.vue?vue&type=template&id=65401e0e&\");\n/* harmony import */ var _tab_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./tab.vue?vue&type=script&lang=js& */ \"./assets/vue/tab.vue?vue&type=script&lang=js&\");\n/* harmony import */ var _node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../node_modules/vue-loader/lib/runtime/componentNormalizer.js */ \"./node_modules/vue-loader/lib/runtime/componentNormalizer.js\");\n\n\n\n\n\n/* normalize component */\n\nvar component = Object(_node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_2__[/* default */ \"a\"])(\n  _tab_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__[/* default */ \"a\"],\n  _tab_vue_vue_type_template_id_65401e0e___WEBPACK_IMPORTED_MODULE_0__[/* render */ \"a\"],\n  _tab_vue_vue_type_template_id_65401e0e___WEBPACK_IMPORTED_MODULE_0__[/* staticRenderFns */ \"b\"],\n  false,\n  null,\n  null,\n  null\n  \n)\n\n/* hot reload */\nif (false) { var api; }\ncomponent.options.__file = \"assets/vue/tab.vue\"\n/* harmony default export */ __webpack_exports__[\"a\"] = (component.exports);\n\n//# sourceURL=webpack:///./assets/vue/tab.vue?");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/***/ }),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/***/ "./assets/vue/tab.vue?vue&type=script&lang=js&":
 | 
				
			||||||
 | 
					/*!*****************************************************!*\
 | 
				
			||||||
 | 
					  !*** ./assets/vue/tab.vue?vue&type=script&lang=js& ***!
 | 
				
			||||||
 | 
					  \*****************************************************/
 | 
				
			||||||
 | 
					/*! exports provided: default */
 | 
				
			||||||
 | 
					/*! exports used: default */
 | 
				
			||||||
 | 
					/***/ (function(module, __webpack_exports__, __webpack_require__) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"use strict";
 | 
				
			||||||
 | 
					eval("/* harmony import */ var _node_modules_vue_loader_lib_index_js_vue_loader_options_tab_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../node_modules/vue-loader/lib??vue-loader-options!./tab.vue?vue&type=script&lang=js& */ \"./node_modules/vue-loader/lib/index.js?!./assets/vue/tab.vue?vue&type=script&lang=js&\");\n /* harmony default export */ __webpack_exports__[\"a\"] = (_node_modules_vue_loader_lib_index_js_vue_loader_options_tab_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__[/* default */ \"a\"]); \n\n//# sourceURL=webpack:///./assets/vue/tab.vue?");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/***/ }),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/***/ "./assets/vue/tab.vue?vue&type=template&id=65401e0e&":
 | 
				
			||||||
 | 
					/*!***********************************************************!*\
 | 
				
			||||||
 | 
					  !*** ./assets/vue/tab.vue?vue&type=template&id=65401e0e& ***!
 | 
				
			||||||
 | 
					  \***********************************************************/
 | 
				
			||||||
 | 
					/*! exports provided: render, staticRenderFns */
 | 
				
			||||||
 | 
					/*! exports used: render, staticRenderFns */
 | 
				
			||||||
 | 
					/***/ (function(module, __webpack_exports__, __webpack_require__) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"use strict";
 | 
				
			||||||
 | 
					eval("/* harmony import */ var _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_tab_vue_vue_type_template_id_65401e0e___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!../../node_modules/vue-loader/lib??vue-loader-options!./tab.vue?vue&type=template&id=65401e0e& */ \"./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/vue-loader/lib/index.js?!./assets/vue/tab.vue?vue&type=template&id=65401e0e&\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_tab_vue_vue_type_template_id_65401e0e___WEBPACK_IMPORTED_MODULE_0__[\"a\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_tab_vue_vue_type_template_id_65401e0e___WEBPACK_IMPORTED_MODULE_0__[\"b\"]; });\n\n\n\n//# sourceURL=webpack:///./assets/vue/tab.vue?");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/***/ }),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/***/ "./assets/vue/tabs.vue":
 | 
				
			||||||
 | 
					/*!*****************************!*\
 | 
				
			||||||
 | 
					  !*** ./assets/vue/tabs.vue ***!
 | 
				
			||||||
 | 
					  \*****************************/
 | 
				
			||||||
 | 
					/*! exports provided: default */
 | 
				
			||||||
 | 
					/*! exports used: default */
 | 
				
			||||||
 | 
					/***/ (function(module, __webpack_exports__, __webpack_require__) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"use strict";
 | 
				
			||||||
 | 
					eval("/* harmony import */ var _tabs_vue_vue_type_template_id_466f44d5___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./tabs.vue?vue&type=template&id=466f44d5& */ \"./assets/vue/tabs.vue?vue&type=template&id=466f44d5&\");\n/* harmony import */ var _tabs_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./tabs.vue?vue&type=script&lang=js& */ \"./assets/vue/tabs.vue?vue&type=script&lang=js&\");\n/* harmony import */ var _node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../node_modules/vue-loader/lib/runtime/componentNormalizer.js */ \"./node_modules/vue-loader/lib/runtime/componentNormalizer.js\");\n\n\n\n\n\n/* normalize component */\n\nvar component = Object(_node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_2__[/* default */ \"a\"])(\n  _tabs_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__[/* default */ \"a\"],\n  _tabs_vue_vue_type_template_id_466f44d5___WEBPACK_IMPORTED_MODULE_0__[/* render */ \"a\"],\n  _tabs_vue_vue_type_template_id_466f44d5___WEBPACK_IMPORTED_MODULE_0__[/* staticRenderFns */ \"b\"],\n  false,\n  null,\n  null,\n  null\n  \n)\n\n/* hot reload */\nif (false) { var api; }\ncomponent.options.__file = \"assets/vue/tabs.vue\"\n/* harmony default export */ __webpack_exports__[\"a\"] = (component.exports);\n\n//# sourceURL=webpack:///./assets/vue/tabs.vue?");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/***/ }),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/***/ "./assets/vue/tabs.vue?vue&type=script&lang=js&":
 | 
				
			||||||
 | 
					/*!******************************************************!*\
 | 
				
			||||||
 | 
					  !*** ./assets/vue/tabs.vue?vue&type=script&lang=js& ***!
 | 
				
			||||||
 | 
					  \******************************************************/
 | 
				
			||||||
 | 
					/*! exports provided: default */
 | 
				
			||||||
 | 
					/*! exports used: default */
 | 
				
			||||||
 | 
					/***/ (function(module, __webpack_exports__, __webpack_require__) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"use strict";
 | 
				
			||||||
 | 
					eval("/* harmony import */ var _node_modules_vue_loader_lib_index_js_vue_loader_options_tabs_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../node_modules/vue-loader/lib??vue-loader-options!./tabs.vue?vue&type=script&lang=js& */ \"./node_modules/vue-loader/lib/index.js?!./assets/vue/tabs.vue?vue&type=script&lang=js&\");\n /* harmony default export */ __webpack_exports__[\"a\"] = (_node_modules_vue_loader_lib_index_js_vue_loader_options_tabs_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__[/* default */ \"a\"]); \n\n//# sourceURL=webpack:///./assets/vue/tabs.vue?");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/***/ }),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/***/ "./assets/vue/tabs.vue?vue&type=template&id=466f44d5&":
 | 
				
			||||||
 | 
					/*!************************************************************!*\
 | 
				
			||||||
 | 
					  !*** ./assets/vue/tabs.vue?vue&type=template&id=466f44d5& ***!
 | 
				
			||||||
 | 
					  \************************************************************/
 | 
				
			||||||
 | 
					/*! exports provided: render, staticRenderFns */
 | 
				
			||||||
 | 
					/*! exports used: render, staticRenderFns */
 | 
				
			||||||
 | 
					/***/ (function(module, __webpack_exports__, __webpack_require__) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"use strict";
 | 
				
			||||||
 | 
					eval("/* harmony import */ var _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_tabs_vue_vue_type_template_id_466f44d5___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!../../node_modules/vue-loader/lib??vue-loader-options!./tabs.vue?vue&type=template&id=466f44d5& */ \"./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/vue-loader/lib/index.js?!./assets/vue/tabs.vue?vue&type=template&id=466f44d5&\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_tabs_vue_vue_type_template_id_466f44d5___WEBPACK_IMPORTED_MODULE_0__[\"a\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_tabs_vue_vue_type_template_id_466f44d5___WEBPACK_IMPORTED_MODULE_0__[\"b\"]; });\n\n\n\n//# sourceURL=webpack:///./assets/vue/tabs.vue?");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/***/ }),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/***/ "./node_modules/vue-loader/lib/index.js?!./assets/vue/tab.vue?vue&type=script&lang=js&":
 | 
				
			||||||
 | 
					/*!*******************************************************************************************************!*\
 | 
				
			||||||
 | 
					  !*** ./node_modules/vue-loader/lib??vue-loader-options!./assets/vue/tab.vue?vue&type=script&lang=js& ***!
 | 
				
			||||||
 | 
					  \*******************************************************************************************************/
 | 
				
			||||||
 | 
					/*! exports provided: default */
 | 
				
			||||||
 | 
					/*! exports used: default */
 | 
				
			||||||
 | 
					/***/ (function(module, __webpack_exports__, __webpack_require__) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"use strict";
 | 
				
			||||||
 | 
					eval("//\n//\n//\n//\n//\n//\n//\n\n/* harmony default export */ __webpack_exports__[\"a\"] = ({\n    props: {\n        value: { default: undefined },\n    },\n\n    methods: {\n        select() {\n            this.$parent.selectTab(this);\n        },\n\n        onclick(event) {\n            this.select();\n            /*if(event.target.href != document.location)\n                window.history.pushState(\n                    { url: event.target.href },\n                    event.target.innerText + ' - ' + document.title,\n                    event.target.href\n                ) */\n        }\n    }\n});\n\n\n//# sourceURL=webpack:///./assets/vue/tab.vue?./node_modules/vue-loader/lib??vue-loader-options");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/***/ }),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/***/ "./node_modules/vue-loader/lib/index.js?!./assets/vue/tabs.vue?vue&type=script&lang=js&":
 | 
				
			||||||
 | 
					/*!********************************************************************************************************!*\
 | 
				
			||||||
 | 
					  !*** ./node_modules/vue-loader/lib??vue-loader-options!./assets/vue/tabs.vue?vue&type=script&lang=js& ***!
 | 
				
			||||||
 | 
					  \********************************************************************************************************/
 | 
				
			||||||
 | 
					/*! exports provided: default */
 | 
				
			||||||
 | 
					/*! exports used: default */
 | 
				
			||||||
 | 
					/***/ (function(module, __webpack_exports__, __webpack_require__) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"use strict";
 | 
				
			||||||
 | 
					eval("//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n/* harmony default export */ __webpack_exports__[\"a\"] = ({\n    props: {\n        default: { default: null },\n    },\n\n    data() {\n        return {\n            value: this.default,\n        }\n    },\n\n    computed: {\n        tab() {\n            const vnode = this.$slots.default && this.$slots.default.find(\n                elm => elm.child && elm.child.value == this.value\n            );\n            return vnode && vnode.child;\n        }\n    },\n\n    methods: {\n        selectTab(tab) {\n            const value = tab.value;\n            if(this.value === value)\n                return;\n\n            this.value = value;\n            this.$emit('select', {target: this, value: value, tab: tab});\n        },\n    },\n});\n\n\n//# sourceURL=webpack:///./assets/vue/tabs.vue?./node_modules/vue-loader/lib??vue-loader-options");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/***/ }),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/***/ "./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/vue-loader/lib/index.js?!./assets/vue/tab.vue?vue&type=template&id=65401e0e&":
 | 
				
			||||||
 | 
					/*!*****************************************************************************************************************************************************************************************!*\
 | 
				
			||||||
 | 
					  !*** ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./assets/vue/tab.vue?vue&type=template&id=65401e0e& ***!
 | 
				
			||||||
 | 
					  \*****************************************************************************************************************************************************************************************/
 | 
				
			||||||
 | 
					/*! exports provided: render, staticRenderFns */
 | 
				
			||||||
 | 
					/*! exports used: render, staticRenderFns */
 | 
				
			||||||
 | 
					/***/ (function(module, __webpack_exports__, __webpack_require__) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"use strict";
 | 
				
			||||||
 | 
					eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return staticRenderFns; });\nvar render = function() {\n  var _vm = this\n  var _h = _vm.$createElement\n  var _c = _vm._self._c || _h\n  return _c(\n    \"li\",\n    {\n      class: { \"is-active\": _vm.$parent.value == _vm.value },\n      on: {\n        click: function($event) {\n          $event.preventDefault()\n          return _vm.onclick($event)\n        }\n      }\n    },\n    [_vm._t(\"default\")],\n    2\n  )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./assets/vue/tab.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/***/ }),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/***/ "./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/vue-loader/lib/index.js?!./assets/vue/tabs.vue?vue&type=template&id=466f44d5&":
 | 
				
			||||||
 | 
					/*!******************************************************************************************************************************************************************************************!*\
 | 
				
			||||||
 | 
					  !*** ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./assets/vue/tabs.vue?vue&type=template&id=466f44d5& ***!
 | 
				
			||||||
 | 
					  \******************************************************************************************************************************************************************************************/
 | 
				
			||||||
 | 
					/*! exports provided: render, staticRenderFns */
 | 
				
			||||||
 | 
					/*! exports used: render, staticRenderFns */
 | 
				
			||||||
 | 
					/***/ (function(module, __webpack_exports__, __webpack_require__) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"use strict";
 | 
				
			||||||
 | 
					eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return staticRenderFns; });\nvar render = function() {\n  var _vm = this\n  var _h = _vm.$createElement\n  var _c = _vm._self._c || _h\n  return _c(\n    \"div\",\n    [\n      _c(\"div\", { staticClass: \"tabs is-centered\" }, [\n        _c(\"ul\", [_vm._t(\"tabs\", null, { value: _vm.value })], 2)\n      ]),\n      _vm._v(\" \"),\n      _vm._t(\"default\", null, { value: _vm.value })\n    ],\n    2\n  )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./assets/vue/tabs.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/***/ })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/******/ });
 | 
				
			||||||
							
								
								
									
										89
									
								
								aircox_web/static/aircox_web/assets/vendor.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										89
									
								
								aircox_web/static/aircox_web/assets/vendor.js
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										69
									
								
								aircox_web/templates/aircox_web/base.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										69
									
								
								aircox_web/templates/aircox_web/base.html
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,69 @@
 | 
				
			|||||||
 | 
					{% load static i18n thumbnail %}
 | 
				
			||||||
 | 
					{% comment %}
 | 
				
			||||||
 | 
					Context:
 | 
				
			||||||
 | 
					- site: current website
 | 
				
			||||||
 | 
					{% endcomment %}
 | 
				
			||||||
 | 
					<html>
 | 
				
			||||||
 | 
					    <head>
 | 
				
			||||||
 | 
					        <meta charset="utf-8">
 | 
				
			||||||
 | 
					        <meta name="application-name" content="aircox">
 | 
				
			||||||
 | 
					        <meta name="description" content="{{ site.description }}">
 | 
				
			||||||
 | 
					        <meta name="keywords" content="{{ site.tags }}">
 | 
				
			||||||
 | 
					        <link rel="icon" href="{% thumbnail site.favicon 32x32 crop %}" />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        {% block assets %}
 | 
				
			||||||
 | 
					        <link rel="stylesheet" type="text/css" href="{% static "aircox_web/assets/main.css" %}"/>
 | 
				
			||||||
 | 
					        <script src="{% static "aircox_web/assets/main.js" %}"></script>
 | 
				
			||||||
 | 
					        <script src="{% static "aircox_web/assets/vendor.js" %}"></script>
 | 
				
			||||||
 | 
					        {% endblock %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <title>
 | 
				
			||||||
 | 
					            {% block head_title %}{{ site.title }}{% endblock %}
 | 
				
			||||||
 | 
					        </title>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        {% block head_extra %}{% endblock %}
 | 
				
			||||||
 | 
					    </head>
 | 
				
			||||||
 | 
					    <body>
 | 
				
			||||||
 | 
					        <div id="app">
 | 
				
			||||||
 | 
					            <nav class="navbar has-shadow" role="navigation" aria-label="main navigation">
 | 
				
			||||||
 | 
					                <div class="container">
 | 
				
			||||||
 | 
					                    <div class="navbar-brand">
 | 
				
			||||||
 | 
					                        <a href="/" title="{% trans "Home" %}" class="navbar-item">
 | 
				
			||||||
 | 
					                            <img src="{{ site.logo.url }}" class="logo"/>
 | 
				
			||||||
 | 
					                        </a>
 | 
				
			||||||
 | 
					                    </div>
 | 
				
			||||||
 | 
					                    <div class="navbar-menu">
 | 
				
			||||||
 | 
					                        <div class="navbar-start">
 | 
				
			||||||
 | 
					                            {{ site_regions.topnav }}
 | 
				
			||||||
 | 
					                        </div>
 | 
				
			||||||
 | 
					                    </div>
 | 
				
			||||||
 | 
					                </div>
 | 
				
			||||||
 | 
					            </nav>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            <div class="container">
 | 
				
			||||||
 | 
					                <div class="columns">
 | 
				
			||||||
 | 
					                    <main class="column page">
 | 
				
			||||||
 | 
					                        <header class="header">
 | 
				
			||||||
 | 
					                            {% block header %}
 | 
				
			||||||
 | 
					                            <h1 class="title is-1">{% block title %}{% endblock %}</h1>
 | 
				
			||||||
 | 
					                            {% endblock %}
 | 
				
			||||||
 | 
					                        </header>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        {% block main %}{% endblock main %}
 | 
				
			||||||
 | 
					                    </main>
 | 
				
			||||||
 | 
					                    <aside class="column is-one-third">
 | 
				
			||||||
 | 
					                        {% block side_nav %}
 | 
				
			||||||
 | 
					                        {% block cover %}
 | 
				
			||||||
 | 
					                        {% if cover is not None %}
 | 
				
			||||||
 | 
					                        <img class="cover" src="{{ cover.url }}" class="cover"/>
 | 
				
			||||||
 | 
					                        {% endif %}
 | 
				
			||||||
 | 
					                        {% endblock %}
 | 
				
			||||||
 | 
					                        {% endblock %}
 | 
				
			||||||
 | 
					                    </aside>
 | 
				
			||||||
 | 
					                </div>
 | 
				
			||||||
 | 
					            </div>
 | 
				
			||||||
 | 
					        </div>
 | 
				
			||||||
 | 
					    </body>
 | 
				
			||||||
 | 
					</html>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -4,29 +4,36 @@ Context variables:
 | 
				
			|||||||
- object: the actual diffusion
 | 
					- object: the actual diffusion
 | 
				
			||||||
- page: current parent page in which item is rendered
 | 
					- page: current parent page in which item is rendered
 | 
				
			||||||
- hide_schedule: if True, do not display start time
 | 
					- hide_schedule: if True, do not display start time
 | 
				
			||||||
 | 
					- hide_headline: if True, do not display headline
 | 
				
			||||||
{% endcomment %}
 | 
					{% endcomment %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{% with page as context_page %}
 | 
					{% with object.initial|default:object as initial %}
 | 
				
			||||||
{% with object.program as program %}
 | 
					{% with initial.program as program %}
 | 
				
			||||||
{% diffusion_page object as page %}
 | 
					{% with initial.page as d_page %}
 | 
				
			||||||
 | 
					{% with program.page as p_page %}
 | 
				
			||||||
 | 
					{% with d_page|default:p_page as c_page %}
 | 
				
			||||||
<article class="media">
 | 
					<article class="media">
 | 
				
			||||||
    <div class="media-left">
 | 
					    <div class="media-left">
 | 
				
			||||||
        <img src="{% thumbnail page.cover|default:site.logo 128x128 crop=scale %}">
 | 
					        <img src="{% thumbnail c_page.cover|default:site.logo 128x128 crop=scale %}"
 | 
				
			||||||
 | 
					            class="small-cover">
 | 
				
			||||||
    </div>
 | 
					    </div>
 | 
				
			||||||
    <div class="media-content">
 | 
					    <div class="media-content">
 | 
				
			||||||
        <div>
 | 
					        <div>
 | 
				
			||||||
            <h4 class="subtitle is-size-4 is-inline-block">
 | 
					            <h5 class="subtitle is-size-5 is-inline-block">
 | 
				
			||||||
            {% if page and context_page != page %}
 | 
					                {% if d_page %}
 | 
				
			||||||
            <a href="{{ page.path }}">{{ page.title }}</a>
 | 
					                <a href="{{ d_page.path }}">{{ d_page.title }}</a>
 | 
				
			||||||
            {% else %}
 | 
					                {% endif %}
 | 
				
			||||||
            {{ page.title|default:program.name }}
 | 
					 | 
				
			||||||
            {% endif %}
 | 
					 | 
				
			||||||
            </h4>
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
            <span class="has-text-weight-normal">
 | 
					                {% if not page or p_page != page %}
 | 
				
			||||||
            {% if object.page is page and context_page != program.page %}
 | 
					                {% if d_page %} — {% endif %}
 | 
				
			||||||
            — <a href="{% url "program-page" slug=program.page.slug %}">{{ program.page.title }}</a>
 | 
					                {% if p_page %}
 | 
				
			||||||
            {% endif %}
 | 
					                <a href="{{ p_page.path }}" class="has-text-grey-dark">
 | 
				
			||||||
 | 
					                    {{ p_page.title }}</a>
 | 
				
			||||||
 | 
					                {% else %}
 | 
				
			||||||
 | 
					                {{ program.name }}
 | 
				
			||||||
 | 
					                {% endif %}
 | 
				
			||||||
 | 
					                {% endif %}
 | 
				
			||||||
 | 
					            </h5>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            {% if not hide_schedule %}
 | 
					            {% if not hide_schedule %}
 | 
				
			||||||
            <time datetime="{{ object.start|date:"c" }}" title="{{ object.start }}"
 | 
					            <time datetime="{{ object.start|date:"c" }}" title="{{ object.start }}"
 | 
				
			||||||
@ -44,13 +51,16 @@ Context variables:
 | 
				
			|||||||
            {% endif %}
 | 
					            {% endif %}
 | 
				
			||||||
            </span>
 | 
					            </span>
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
 | 
					        {% if not hide_headline %}
 | 
				
			||||||
        <div class="content">
 | 
					        <div class="content">
 | 
				
			||||||
          {{ page.headline|default:program.page.headline }}
 | 
					          {{ c_page.headline }}
 | 
				
			||||||
        </p>
 | 
					        </div>
 | 
				
			||||||
      </div>
 | 
					        {% endif %}
 | 
				
			||||||
    </div>
 | 
					    </div>
 | 
				
			||||||
</article>
 | 
					</article>
 | 
				
			||||||
{% endwith %}
 | 
					{% endwith %}
 | 
				
			||||||
{% endwith %}
 | 
					{% endwith %}
 | 
				
			||||||
 | 
					{% endwith %}
 | 
				
			||||||
 | 
					{% endwith %}
 | 
				
			||||||
 | 
					{% endwith %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -16,9 +16,8 @@
 | 
				
			|||||||
{{ block.super }}
 | 
					{{ block.super }}
 | 
				
			||||||
{% if program %}
 | 
					{% if program %}
 | 
				
			||||||
<h4 class="subtitle is-size-3">
 | 
					<h4 class="subtitle is-size-3">
 | 
				
			||||||
    <a href="{% url "page" path=program.page.path %}">❬ {{ program.name }}</a></li>
 | 
					    <a href="{% url "program-page" slug=program.slug %}">❬ {{ program.name }}</a></li>
 | 
				
			||||||
</h4>
 | 
					</h4>
 | 
				
			||||||
{% include "aircox_web/program_header.html" %}
 | 
					 | 
				
			||||||
{% endif %}
 | 
					{% endif %}
 | 
				
			||||||
{% endblock %}
 | 
					{% endblock %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -26,9 +25,7 @@
 | 
				
			|||||||
{% block content %}
 | 
					{% block content %}
 | 
				
			||||||
<section class="section">
 | 
					<section class="section">
 | 
				
			||||||
    {% for object in object_list %}
 | 
					    {% for object in object_list %}
 | 
				
			||||||
    {% with object.diffusion as object %}
 | 
					 | 
				
			||||||
    {% include "aircox_web/diffusion_item.html" %}
 | 
					    {% include "aircox_web/diffusion_item.html" %}
 | 
				
			||||||
    {% endwith %}
 | 
					 | 
				
			||||||
    {% endfor %}
 | 
					    {% endfor %}
 | 
				
			||||||
</section>
 | 
					</section>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -1,8 +0,0 @@
 | 
				
			|||||||
{% extends "aircox_web/page.html" %}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
{% block header %}
 | 
					 | 
				
			||||||
{{ block.super }}
 | 
					 | 
				
			||||||
{% include "aircox_web/program_header.html" %}
 | 
					 | 
				
			||||||
{% endblock %}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
							
								
								
									
										25
									
								
								aircox_web/templates/aircox_web/program_header.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								aircox_web/templates/aircox_web/program_header.html
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,25 @@
 | 
				
			|||||||
 | 
					{% load i18n %}
 | 
				
			||||||
 | 
					<section class="is-size-5">
 | 
				
			||||||
 | 
					    {% for schedule in program.schedule_set.all %}
 | 
				
			||||||
 | 
					    <p>
 | 
				
			||||||
 | 
					        {{ schedule.get_frequency_verbose }}
 | 
				
			||||||
 | 
					        {% with schedule.start|date:"H:i" as start %}
 | 
				
			||||||
 | 
					        {% with schedule.end|date:"H:i" as end %}
 | 
				
			||||||
 | 
					        <time datetime="{{ start }}">{{ start }}</time>
 | 
				
			||||||
 | 
					        —
 | 
				
			||||||
 | 
					        <time datetime="{{ end }}">{{ end }}</time>
 | 
				
			||||||
 | 
					        {% endwith %}
 | 
				
			||||||
 | 
					        {% endwith %}
 | 
				
			||||||
 | 
					        <small>
 | 
				
			||||||
 | 
					            {% if schedule.initial %}
 | 
				
			||||||
 | 
					            {% with schedule.initial.date as date %}
 | 
				
			||||||
 | 
					            <span title="{% blocktrans %}Rerun of {{ date }}{% endblocktrans %}">
 | 
				
			||||||
 | 
					                ({% trans "rerun" %})
 | 
				
			||||||
 | 
					            </span>
 | 
				
			||||||
 | 
					            {% endwith %}
 | 
				
			||||||
 | 
					            {% endif %}
 | 
				
			||||||
 | 
					        </small>
 | 
				
			||||||
 | 
					    </p>
 | 
				
			||||||
 | 
					    {% endfor %}
 | 
				
			||||||
 | 
					</section>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										38
									
								
								aircox_web/templates/aircox_web/program_page.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								aircox_web/templates/aircox_web/program_page.html
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,38 @@
 | 
				
			|||||||
 | 
					{% extends "aircox_web/page.html" %}
 | 
				
			||||||
 | 
					{% load i18n %}
 | 
				
			||||||
 | 
					{% with page.program as program %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{% block header %}
 | 
				
			||||||
 | 
					{{ block.super }}
 | 
				
			||||||
 | 
					{% include "aircox_web/program_header.html" %}
 | 
				
			||||||
 | 
					{% endblock %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{% block side_nav %}
 | 
				
			||||||
 | 
					{{ block.super }}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{% if diffusions %}
 | 
				
			||||||
 | 
					<section>
 | 
				
			||||||
 | 
					    <h4 class="subtitle is-size-4">{% trans "Last shows" %}</h4>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    {% for object in diffusions %}
 | 
				
			||||||
 | 
					    {% include "aircox_web/diffusion_item.html" %}
 | 
				
			||||||
 | 
					    {% endfor %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <br>
 | 
				
			||||||
 | 
					    <nav class="pagination is-centered">
 | 
				
			||||||
 | 
					        <ul class="pagination-list">
 | 
				
			||||||
 | 
					            <li>
 | 
				
			||||||
 | 
					                <a href="{% url "diffusion-list" program_slug=page.slug %}"
 | 
				
			||||||
 | 
					                    class="pagination-link"
 | 
				
			||||||
 | 
					                    aria-label="{% trans "Show all diffusions" %}">
 | 
				
			||||||
 | 
					                    {% trans "All diffusions" %}
 | 
				
			||||||
 | 
					                </a>
 | 
				
			||||||
 | 
					            </li>
 | 
				
			||||||
 | 
					        </ul>
 | 
				
			||||||
 | 
					</section>
 | 
				
			||||||
 | 
					{% endif %}
 | 
				
			||||||
 | 
					{% endblock %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{% endwith %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -12,7 +12,8 @@ register = template.Library()
 | 
				
			|||||||
@register.simple_tag(name='diffusion_page')
 | 
					@register.simple_tag(name='diffusion_page')
 | 
				
			||||||
def do_diffusion_page(diffusion):
 | 
					def do_diffusion_page(diffusion):
 | 
				
			||||||
    """ Return page for diffusion. """
 | 
					    """ Return page for diffusion. """
 | 
				
			||||||
    for obj in (diffusion, diffusion.program):
 | 
					    diff = diffusion.initial if diffusion.initial is not None else diffusion
 | 
				
			||||||
 | 
					    for obj in (diff, diffusion.program):
 | 
				
			||||||
        page = getattr(obj, 'page', None)
 | 
					        page = getattr(obj, 'page', None)
 | 
				
			||||||
        if page is not None and page.status == Page.STATUS.published:
 | 
					        if page is not None and page.status == Page.STATUS.published:
 | 
				
			||||||
            return page
 | 
					            return page
 | 
				
			||||||
 | 
				
			|||||||
@ -10,13 +10,12 @@ register_converter(WeekConverter, 'week')
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
urlpatterns = [
 | 
					urlpatterns = [
 | 
				
			||||||
    path('programs/<slug:slug>/',
 | 
					    path('programs/<slug:slug>/',
 | 
				
			||||||
        views.ProgramPageView.as_view(), name='program-page'),
 | 
					         views.ProgramPageView.as_view(), name='program-page'),
 | 
				
			||||||
 | 
					    path('diffusion/<slug:slug>/',
 | 
				
			||||||
 | 
					         views.DiffusionPageView.as_view(), name='diffusion-page'),
 | 
				
			||||||
    path('programs/<slug:program_slug>/diffusions/',
 | 
					    path('programs/<slug:program_slug>/diffusions/',
 | 
				
			||||||
         views.DiffusionsView.as_view(), name='diffusion-list'),
 | 
					         views.DiffusionsView.as_view(), name='diffusion-list'),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    path('diffusion/<slug:slug>/',
 | 
					 | 
				
			||||||
        views.ProgramPageView.as_view(), name='diffusion-page'),
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    path('diffusions/',
 | 
					    path('diffusions/',
 | 
				
			||||||
         views.TimetableView.as_view(), name='timetable'),
 | 
					         views.TimetableView.as_view(), name='timetable'),
 | 
				
			||||||
    path('diffusions/<week:date>/',
 | 
					    path('diffusions/<week:date>/',
 | 
				
			||||||
@ -25,6 +24,6 @@ urlpatterns = [
 | 
				
			|||||||
         views.DiffusionsView.as_view(), name='diffusion-list'),
 | 
					         views.DiffusionsView.as_view(), name='diffusion-list'),
 | 
				
			||||||
    path('logs/', views.LogsView.as_view(), name='logs'),
 | 
					    path('logs/', views.LogsView.as_view(), name='logs'),
 | 
				
			||||||
    path('logs/<date:date>/', views.LogsView.as_view(), name='logs'),
 | 
					    path('logs/<date:date>/', views.LogsView.as_view(), name='logs'),
 | 
				
			||||||
    path('<page_path:path>', views.route_page, name='page'),
 | 
					    # path('<page_path:path>', views.route_page, name='page'),
 | 
				
			||||||
]
 | 
					]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -11,7 +11,8 @@ from django.views.generic.base import TemplateResponseMixin, ContextMixin
 | 
				
			|||||||
from content_editor.contents import contents_for_item
 | 
					from content_editor.contents import contents_for_item
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from aircox import models as aircox
 | 
					from aircox import models as aircox
 | 
				
			||||||
from .models import Site, Page, DiffusionPage, ProgramPage
 | 
					from .models import Site, Page, DiffusionPage, ProgramPage, \
 | 
				
			||||||
 | 
					        get_diffusions_with_page
 | 
				
			||||||
from .renderer import site_renderer, page_renderer
 | 
					from .renderer import site_renderer, page_renderer
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -27,7 +28,7 @@ def route_page(request, path=None, *args, model=None, site=None, **kwargs):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    model = model if model is not None else Page
 | 
					    model = model if model is not None else Page
 | 
				
			||||||
    page = get_object_or_404(
 | 
					    page = get_object_or_404(
 | 
				
			||||||
        model.objects.select_subclasses().active(),
 | 
					        model.objects.select_subclasses().live(),
 | 
				
			||||||
        path=path
 | 
					        path=path
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
    kwargs['page'] = page
 | 
					    kwargs['page'] = page
 | 
				
			||||||
@ -46,7 +47,8 @@ class BaseView(TemplateResponseMixin, ContextMixin):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    def get_context_data(self, **kwargs):
 | 
					    def get_context_data(self, **kwargs):
 | 
				
			||||||
        if kwargs.get('site_regions') is None:
 | 
					        if kwargs.get('site_regions') is None:
 | 
				
			||||||
            contents = contents_for_item(self.site, site_renderer._renderers.keys())
 | 
					            contents = contents_for_item(
 | 
				
			||||||
 | 
					                self.site, site_renderer._renderers.keys())
 | 
				
			||||||
            kwargs['site_regions'] = contents.render_regions(site_renderer)
 | 
					            kwargs['site_regions'] = contents.render_regions(site_renderer)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        kwargs.setdefault('site', self.site)
 | 
					        kwargs.setdefault('site', self.site)
 | 
				
			||||||
@ -54,7 +56,7 @@ class BaseView(TemplateResponseMixin, ContextMixin):
 | 
				
			|||||||
        return super().get_context_data(**kwargs)
 | 
					        return super().get_context_data(**kwargs)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class PageView(BaseView):
 | 
					class PageView(BaseView, DetailView):
 | 
				
			||||||
    """ Base view class for pages. """
 | 
					    """ Base view class for pages. """
 | 
				
			||||||
    template_name = 'aircox_web/page.html'
 | 
					    template_name = 'aircox_web/page.html'
 | 
				
			||||||
    context_object_name = 'page'
 | 
					    context_object_name = 'page'
 | 
				
			||||||
@ -77,33 +79,39 @@ class PageView(BaseView):
 | 
				
			|||||||
        return super().get_context_data(**kwargs)
 | 
					        return super().get_context_data(**kwargs)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class ProgramPageView(PageView, DetailView):
 | 
					class ProgramPageView(PageView):
 | 
				
			||||||
    """ Base view class for pages. """
 | 
					    """ Base view class for pages. """
 | 
				
			||||||
    template_name = 'aircox_web/program.html'
 | 
					    template_name = 'aircox_web/program_page.html'
 | 
				
			||||||
    model = ProgramPage
 | 
					    model = ProgramPage
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    list_count=10
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def get_queryset(self):
 | 
					    def get_queryset(self):
 | 
				
			||||||
        return super().get_queryset().select_related('program')
 | 
					        return super().get_queryset().select_related('program')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def get_context_data(self, program=None, **kwargs):
 | 
					    def get_context_data(self, program=None, diffusions=None, **kwargs):
 | 
				
			||||||
        kwargs.setdefault('program', self.object.program)
 | 
					        program = program or self.object.program
 | 
				
			||||||
        kwargs['diffusions'] = DiffusionPage.objects.filter(
 | 
					        diffusions = diffusions or \
 | 
				
			||||||
            diffusion__program=kwargs['program']
 | 
					                     get_diffusions_with_page().filter(program=program)
 | 
				
			||||||
 | 
					        return super().get_context_data(
 | 
				
			||||||
 | 
					            program=program,
 | 
				
			||||||
 | 
					            diffusions=diffusions.order_by('-start')[:self.list_count],
 | 
				
			||||||
 | 
					            **kwargs
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
        return super().get_context_data(**kwargs)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class DiffusionView(PageView):
 | 
					class DiffusionPageView(PageView):
 | 
				
			||||||
    template_name = 'aircox_web/diffusion.html'
 | 
					    # template_name = 'aircox_web/diffusion.html'
 | 
				
			||||||
 | 
					    model = DiffusionPage
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# TODO: pagination: in template, only a limited number of pages displayed
 | 
					# TODO: pagination: in template, only a limited number of pages displayed
 | 
				
			||||||
 | 
					 | 
				
			||||||
# DiffusionsView use diffusion instead of diffusion page for different reasons:
 | 
					# DiffusionsView use diffusion instead of diffusion page for different reasons:
 | 
				
			||||||
# more straightforward, it handles reruns
 | 
					# more straightforward, it handles reruns
 | 
				
			||||||
class DiffusionsView(BaseView, ListView):
 | 
					class DiffusionsView(BaseView, ListView):
 | 
				
			||||||
    template_name = 'aircox_web/diffusions.html'
 | 
					    template_name = 'aircox_web/diffusions.html'
 | 
				
			||||||
    model = DiffusionPage
 | 
					    model = aircox.Diffusion
 | 
				
			||||||
    paginate_by = 30
 | 
					    paginate_by = 30
 | 
				
			||||||
    program = None
 | 
					    program = None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -115,13 +123,11 @@ class DiffusionsView(BaseView, ListView):
 | 
				
			|||||||
        return super().get(request, *args, **kwargs)
 | 
					        return super().get(request, *args, **kwargs)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def get_queryset(self):
 | 
					    def get_queryset(self):
 | 
				
			||||||
        qs = super().get_queryset().live() \
 | 
					        qs = get_diffusions_with_page(super().get_queryset()) \
 | 
				
			||||||
                    .select_related('diffusion')
 | 
					            .select_related('page', 'program')
 | 
				
			||||||
        if self.program:
 | 
					        if self.program:
 | 
				
			||||||
            qs = qs.filter(diffusion__program=self.program)
 | 
					            qs = qs.filter(program=self.program)
 | 
				
			||||||
        else:
 | 
					        return qs.order_by('-start')
 | 
				
			||||||
            qs = qs.select_related('diffusion__program')
 | 
					 | 
				
			||||||
        return qs.order_by('-diffusion__start')
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def get_context_data(self, **kwargs):
 | 
					    def get_context_data(self, **kwargs):
 | 
				
			||||||
        program = kwargs.setdefault('program', self.program)
 | 
					        program = kwargs.setdefault('program', self.program)
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user