1from django.conf.urls import url
2from django.core.exceptions import ObjectDoesNotExist
3from django.http import HttpResponse
4from django.urls import reverse
5from django.utils.translation import ugettext_lazy as _
6
7from cms.app_base import CMSApp
8from cms.test_utils.project.sampleapp.cms_menus import SampleAppMenu, StaticMenu3, StaticMenu4
9from cms.apphook_pool import apphook_pool
10
11from .models import SampleAppConfig
12
13
14class AppWithNoMenu(CMSApp):
15    app_name = 'app_with_no_menu'
16
17    def get_urls(self, page=None, language=None, **kwargs):
18        return ["cms.test_utils.project.sampleapp.urls"]
19
20
21class SampleApp(CMSApp):
22    name = _("Sample App")
23    permissions = True
24
25    def get_menus(self, page=None, language=None, **kwargs):
26        return [SampleAppMenu]
27
28    def get_urls(self, page=None, language=None, **kwargs):
29        return ["cms.test_utils.project.sampleapp.urls"]
30
31
32class SampleAppWithConfig(CMSApp):
33    name = _("Sample App with config")
34    app_config = SampleAppConfig
35
36    def get_urls(self, page=None, language=None, **kwargs):
37        return ["cms.test_utils.project.sampleapp.urls_sample_config"]
38
39    def get_configs(self):
40        return self.app_config.objects.all()
41
42    def get_config(self, namespace):
43        try:
44            return self.app_config.objects.get(namespace=namespace)
45        except ObjectDoesNotExist:
46            return None
47
48    def get_config_add_url(self):
49        return reverse('admin:%s_%s_add' % (self.app_config._meta.app_label, self.app_config._meta.model_name))
50
51
52class SampleAppWithExcludedPermissions(CMSApp):
53    name = _("Sample App with excluded permissions")
54    permissions = True
55    exclude_permissions = ['excluded']
56
57    def get_urls(self, page=None, language=None, **kwargs):
58        return ["cms.test_utils.project.sampleapp.urls_excluded"]
59
60
61class SampleApp2(CMSApp):
62    name = _("Sample App 2")
63
64    def get_menus(self, page=None, language=None, **kwargs):
65        return [StaticMenu3]
66
67    def get_urls(self, page=None, language=None, **kwargs):
68        return ["cms.test_utils.project.sampleapp.urls2"]
69
70
71class SampleApp3(CMSApp):
72    # CMSApp which returns the url directly rather than trough another Python module
73    name = _("Sample App 3")
74
75    def get_urls(self, page=None, language=None, **kwargs):
76        def my_view(request):
77            return HttpResponse("Sample App 3 Response")
78
79        return [
80            url(r'^$', my_view, name='sample3-root'),
81        ]
82
83
84class NamespacedApp(CMSApp):
85    name = _("Namespaced App")
86    app_name = 'namespaced_app_ns'
87
88    def get_menus(self, page=None, language=None, **kwargs):
89        return [SampleAppMenu, StaticMenu3]
90
91    def get_urls(self, page=None, language=None, **kwargs):
92        return [
93            "cms.test_utils.project.sampleapp.ns_urls",
94            "cms.test_utils.project.sampleapp.urls"
95        ]
96
97
98class ParentApp(CMSApp):
99    name = _("Parent app")
100
101    def get_urls(self, page=None, language=None, **kwargs):
102        return ["cms.test_utils.project.sampleapp.urls_parentapp"]
103
104
105class ChildApp(CMSApp):
106    name = _("Child app")
107
108    def get_urls(self, page=None, language=None, **kwargs):
109        return ["cms.test_utils.project.sampleapp.urls_childapp"]
110
111
112class VariableUrlsApp(CMSApp):
113    name = _("Variable urls-menus App")
114
115    def get_menus(self, page=None, language=None, **kwargs):
116        if page and page.reverse_id == 'page1':
117            return [SampleAppMenu]
118        elif page and page.reverse_id == 'page2':
119            return [StaticMenu4]
120        else:
121            return [StaticMenu4, SampleAppMenu]
122
123    def get_urls(self, page=None, language=None, **kwargs):
124        if page and page.reverse_id == 'page1':
125            return ["cms.test_utils.project.sampleapp.urls"]
126
127        else:
128            return ["cms.test_utils.project.sampleapp.urls2"]
129
130
131apphook_pool.register(ChildApp)
132apphook_pool.register(SampleApp)
133apphook_pool.register(SampleAppWithExcludedPermissions)
134apphook_pool.register(SampleApp2)
135apphook_pool.register(SampleApp3)
136apphook_pool.register(NamespacedApp)
137apphook_pool.register(ParentApp)
138apphook_pool.register(VariableUrlsApp)
139