From b255fa8d6e7afce01937c643c49b85a1e310ea5e Mon Sep 17 00:00:00 2001 From: Piero Toffanin Date: Mon, 6 Nov 2017 13:45:14 -0500 Subject: [PATCH] Started adding the possibility to customize colors, app name --- app/admin.py | 11 +- app/boot.py | 24 +- app/models/__init__.py | 3 + app/models/setting.py | 30 ++ app/models/theme.py | 31 ++ app/static/app/android-chrome-192x192.png | Bin 2360 -> 0 bytes app/static/app/android-chrome-512x512.png | Bin 10524 -> 0 bytes app/static/app/apple-touch-icon.png | Bin 2363 -> 0 bytes app/static/app/browserconfig.xml | 9 - app/static/app/css/main.scss | 6 - app/static/app/favicon-16x16.png | Bin 383 -> 0 bytes app/static/app/favicon-32x32.png | Bin 561 -> 0 bytes app/static/app/favicon.ico | Bin 15086 -> 0 bytes app/static/app/img/logo36.png | Bin 1332 -> 0 bytes app/static/app/js/MapView.jsx | 2 +- app/static/app/manifest.json | 17 - app/static/app/mstile-150x150.png | Bin 1521 -> 0 bytes app/static/app/safari-pinned-tab.svg | 448 ---------------------- app/templates/app/base.html | 25 +- app/templatetags/settings.py | 16 + nginx/nginx.conf | 8 + requirements.txt | 4 + webodm/settings.py | 2 + webodm/urls.py | 15 +- 24 files changed, 152 insertions(+), 499 deletions(-) create mode 100644 app/models/setting.py create mode 100644 app/models/theme.py delete mode 100644 app/static/app/android-chrome-192x192.png delete mode 100644 app/static/app/android-chrome-512x512.png delete mode 100644 app/static/app/apple-touch-icon.png delete mode 100644 app/static/app/browserconfig.xml delete mode 100644 app/static/app/favicon-16x16.png delete mode 100644 app/static/app/favicon-32x32.png delete mode 100644 app/static/app/favicon.ico delete mode 100644 app/static/app/img/logo36.png delete mode 100644 app/static/app/manifest.json delete mode 100644 app/static/app/mstile-150x150.png delete mode 100644 app/static/app/safari-pinned-tab.svg create mode 100644 app/templatetags/settings.py diff --git a/app/admin.py b/app/admin.py index ef34ef52..be7e5e83 100644 --- a/app/admin.py +++ b/app/admin.py @@ -2,7 +2,7 @@ from django.contrib import admin from guardian.admin import GuardedModelAdmin from app.models import Preset -from .models import Project, Task, ImageUpload +from .models import Project, Task, ImageUpload, Setting, Theme admin.site.register(Project, GuardedModelAdmin) @@ -17,3 +17,12 @@ admin.site.register(ImageUpload, ImageUploadAdmin) admin.site.register(Preset, admin.ModelAdmin) + +class SettingAdmin(admin.ModelAdmin): + def has_add_permission(self, request): + # if there's already an entry, do not allow adding + count = Setting.objects.all().count() + return count == 0 + +admin.site.register(Setting, SettingAdmin) +admin.site.register(Theme, admin.ModelAdmin) \ No newline at end of file diff --git a/app/boot.py b/app/boot.py index 5b82a32a..63085ae5 100644 --- a/app/boot.py +++ b/app/boot.py @@ -1,15 +1,20 @@ +import os + from django.contrib.auth.models import Permission from django.contrib.auth.models import User, Group from django.core.exceptions import ObjectDoesNotExist +from django.core.files import File from django.db.utils import ProgrammingError from guardian.shortcuts import assign_perm from app.models import Preset +from app.models import Theme from nodeodm.models import ProcessingNode # noinspection PyUnresolvedReferences +from webodm.settings import MEDIA_ROOT from . import scheduler, signals import logging -from .models import Task +from .models import Task, Setting from webodm import settings from webodm.wsgi import booted @@ -65,6 +70,23 @@ def boot(): ]) Preset.objects.get_or_create(name='Default', system=True, options=[{'name': 'dsm', 'value': True}]) + # Add settings + Setting.objects.all().delete() + Theme.objects.all().delete() + + default_theme, created = Theme.objects.get_or_create(name='Default') + if created: + logger.info("Created default theme") + + if Setting.objects.all().count() == 0: + s = Setting.objects.create( + app_name='WebODM', + theme=default_theme) + default_logo = os.path.join('app', 'static', 'app', 'img', 'logo512.png') + s.app_logo.save(os.path.basename(default_logo), File(open(default_logo, 'rb'))) + + logger.info("Created settings") + # Unlock any Task that might have been locked Task.objects.filter(processing_lock=True).update(processing_lock=False) diff --git a/app/models/__init__.py b/app/models/__init__.py index 184de3f5..7b510c73 100644 --- a/app/models/__init__.py +++ b/app/models/__init__.py @@ -2,3 +2,6 @@ from .image_upload import ImageUpload, image_directory_path from .project import Project from .task import Task, validate_task_options, gcp_directory_path from .preset import Preset +from .theme import Theme +from .setting import Setting + diff --git a/app/models/setting.py b/app/models/setting.py new file mode 100644 index 00000000..164cf4a2 --- /dev/null +++ b/app/models/setting.py @@ -0,0 +1,30 @@ +import logging + +from django.db import models +from imagekit.models import ImageSpecField +from imagekit.processors import ResizeToFit + +from .theme import Theme + +logger = logging.getLogger('app.logger') + + +class Setting(models.Model): + app_name = models.CharField(max_length=255, blank=False, null=False, help_text="The name of your application") + app_logo = models.ImageField(upload_to="settings/", blank=False, null=False, help_text="A 512x512 logo of your application (.png or .jpeg)") + app_logo_36 = ImageSpecField(source='app_logo', + processors=[ResizeToFit(36, 36)], + format='PNG', + options={'quality': 90}) + app_logo_favicon = ImageSpecField(source='app_logo', + processors=[ResizeToFit(48, 48)], + format='PNG', + options={'quality': 90}) + + organization_name = models.CharField(max_length=255, blank=True, null=True, help_text="The name of your organization") + organization_website = models.URLField(max_length=255, blank=True, null=True, help_text="The website URL of your organization") + theme = models.ForeignKey(Theme, blank=False, null=False, on_delete=models.DO_NOTHING, + help_text="Active theme") + + def __str__(self): + return "Application" \ No newline at end of file diff --git a/app/models/theme.py b/app/models/theme.py new file mode 100644 index 00000000..a315083e --- /dev/null +++ b/app/models/theme.py @@ -0,0 +1,31 @@ +import logging + +from django.db import models +from colorfield.fields import ColorField + +logger = logging.getLogger('app.logger') + +class Theme(models.Model): + name = models.CharField(max_length=255, blank=False, null=False, help_text="Name of theme") + + # Similar to how discourse.org does it + primary = ColorField(default='#2c3e50', help_text="Most text, icons, and borders.") + secondary = ColorField(default='#ffffff', help_text="The main background color, and text color of some buttons.") + tertiary = ColorField(default='#18bc9c', help_text="Navigation links.") + + button_primary = ColorField(default='#2c3e50', help_text="Primary button color.") + button_default = ColorField(default='#95a5a6', help_text="Default button color.") + button_danger = ColorField(default='#95a5a6', help_text="Delete button color.") + + header_background = ColorField(default='#18bc9c', help_text="Background color of the site's header.") + header_primary = ColorField(default='#ffffff', help_text="Text and icons in the site's header.") + highlight = ColorField(default='#f7f7f7', help_text="The background color of panels.") + + dialog_warning = ColorField(default='#f39c12', help_text="The border color of warning dialogs.") + + failed = ColorField(default='#ffcbcb', help_text="The background color of failed notifications.") + success = ColorField(default='#cbffcd', help_text="The background color of success notifications.") + + def __str__(self): + return self.name + diff --git a/app/static/app/android-chrome-192x192.png b/app/static/app/android-chrome-192x192.png deleted file mode 100644 index c047cd29471149703d273145f7872071acc53098..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2360 zcmV-83CH${P)Px#32;bRa{vHj0001F00G)U9j*WX04h*SR7L&&{v5!e zF2$)x%(C?S`(e|)kl@g<>E7G*@aXvU$M5KT+Q<*Ro&W#;N78QH0000CbW%=J_3-NF z?cL$p;^^Sti{f6q000OaNkl-2xzp&bUQBFcw@ z!w=3KOoZWYdj3ZG)WPP20RHA*w}-Vh@A5M%gum@Hm;ULCjwAprM>ApEs+V%+@0X6{ zg>-Ofy&Yiny%4p|{ig4?4q)lUPi+7no)4wA*nrS_Tb5q<)C|z7e18@}tEJLyReIrm z6F~8JNVJbNGwpv#NiWFi0sKQD*}kIzw$Rc)cW43HGIW>f6YBfR^0ai&uLCGP4mE87 zp(OvfPWp9L0{|#5`r*OD;q78jV=6$qpgV8);n`oV(kcZ2rCYHjoZHYm+g3imN)Ae* zyNFB27C4h50Y2ixy&n5x>lxnXjtsDl|K&z(mn}V<)HMo#69}#Vg%^7`1!)$1PT)G= z=D)}&6a>Hrq?Hx9t@mSqHtr)xcmAKz&lgkxe~|Q(*jtpsHul82S?N zLjiq5YHWU{FhD7g;jG1;FUZ^?6!mWgA8y=mvJy3`4#~% zC5-7}<61lkYzjto((O=z5kMbgrPI-T{=fT78shq%gaG~soEJhz`0s;wN|Xlw&Hzdo zgH^<4GZPtc@s?@AxWa=R0GNQ&LbavP)tH+N>7|*;^a6mTva8AsjR5wi4Hb;Q6Pyf6 zjpl6#(5V`dRyJij0l+>m?R1yNV3IacAr7@ZVRW9D_W6}$UF^eQ5>o)+vC(nlkM>!I zQ*+GM0)Xjk%-UrNn7MH{?P5-A0L8q;N~4KoV`6-VOwu(wt7c<>nvLjPKkhQqA^glZ zoZ8aD?97Yp*5n2pAe#^Xd=LN_cVlHinkm%Cx6}Y|05Bl~^ri=RSwAZ(O8^PR^tbR$ z=J$^h^7RsqX%3z|laW;OoXOAOSEO`#zUOWn)XASpa+$#Gt@Sz9>SCy^qY*7PmzcA zRl5zl188LXOk27xRNL^7-sqigRG8?ODbbtKXjgqf0w^2y?rcafUuS+p6PD@%9-bMB zLOHM2a}H}MLZ<4epDLPOpKg9dinPaD^{%h>`aEPdY94f!3`#T zI#1P!VeNX2=ojp|d2?4rS0gXT^>!>BoX`}<{lmI?dS@O|C}%=rL*C($CMmV)?k-3n zBCueDmd2)wk65;nW1FQs4k$zfg5EW>^j*UlPF#CNJ-!!p+cy*nu`hj^v7WHVr%=TK zwMVVKE-1tVKy4mQSJr%vR+13{R=@XS3I(tj6nkV2ojKb{VCg6}@+(=q7@o?&%5L!m zmcE{|pJf(55vMW1p7{KeQwZ>C=5M|zAQqj>COM6*v>vAcjWXHX;?Y(V(969pM!R5%px}Yy1=}m8>pDiapmEy=9PzZVx_euc(C^S`E00;^x z2&4jtDWo8f?%G3J7@Cvhw*@E|&Q9wA5XS*s+WWQu1>^B=DgesSU?9U3Qajpea;ZR( z7*I&PRA?4E9EoEJ=@+|F54~J-0`m}s^vks_;KYIKE0|!U4>%=V$P|$nL}xN&<|=av z`XUm81S5UW*QPBXl@Jutr!D%#3#1Y;g_EfhFMaB`7p4+?QT0-%j{4*`K&ixdes0OH zHGSuC07d5%>3h5ZS*+QB#DNS^NW1~DZlOdVgA|f)q1r;rCJ;noK_SH^kZ)sinr$qM z#4&{w+gR;Y3~pN}mEeAHLY7vpdB~*%^(qGUjwYg%K-~U1q$wpBiXr25DTdU&ob&Qs z7o-lGu42@oq&AnLV3?*T=)9~sm%{AMG=*8$rDf;Eap&cI=LZzdk64@^5;;HSa(+4ER|H00012dQ@0+Qek%>aB^>EX>4U6ba`-PAZc)PV*mhn zoa6Eg2ys>@D9TUE%t_@^00ScnE@KN5BNI!L6ay0=M1VBIWCJ6!R3OXP)X2ol#2my2 e%YaCrN-hBE7ZG&wLN%2D0000V7oVf*i+=?f>04 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 z004NL - - - - - #00aba9 - - - diff --git a/app/static/app/css/main.scss b/app/static/app/css/main.scss index c81fea74..47ae9281 100644 --- a/app/static/app/css/main.scss +++ b/app/static/app/css/main.scss @@ -218,9 +218,3 @@ button i.glyphicon{ top: 0px; left: 50px; } - -.navbar-link { - position: absolute; - top: 0px; -} - diff --git a/app/static/app/favicon-16x16.png b/app/static/app/favicon-16x16.png deleted file mode 100644 index 4d107580e6635fa3b00fb921b2ed7a6df862e58c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 383 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFY;1lBNcXq4%!Nn%WR%Kj0P<`vf*4Gc_J-Igd;l(vC?i_mebkCc|cfWq* z+dH>mb;Dwy7M_wIzu>?B{{8v$`wtNR{xhAc|0z(Mv%n*=n1LY$$V_2iyyYaj4#-OL zba4#fxSniL?D6r8q~cs-p7u>nm3%FFmlFlFMdFsEYRo%vK&yD!k-ujSGO+a-r^m#c zo0FMv;gRKy1B%57f`=cfip}0RdvA`!xee;Yd1l%c%?SsVHgqu`=z4hTA={y~4bfc1 zYz&dLW)pc1eBTbVF}x}yq9iD>T%n*SKP@vSRiUJ^AXOo=pd^`rp<>SCPdprjVHz5z z{7;|pd>X{Stjw*K%q^@e>^)h8Sy;iP!Q^lXv-0K;h0`~#oH%mkh|Cf8(+wUAy!04e Xi3^r|ax$F?w1UCY)z4*}Q$iB}gcF)f diff --git a/app/static/app/favicon-32x32.png b/app/static/app/favicon-32x32.png deleted file mode 100644 index bc4c6c92f6430a6557949f9c0e97b4197c9d7115..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 561 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 diff --git a/app/static/app/js/MapView.jsx b/app/static/app/js/MapView.jsx index 0f8bd8a4..51d6dbab 100644 --- a/app/static/app/js/MapView.jsx +++ b/app/static/app/js/MapView.jsx @@ -89,7 +89,7 @@ class MapView extends React.Component { + className={"btn btn-sm " + (mapType.type === this.state.selectedMapType ? "btn-primary" : "btn-default")}>{mapType.label} )} diff --git a/app/static/app/manifest.json b/app/static/app/manifest.json deleted file mode 100644 index 325a0752..00000000 --- a/app/static/app/manifest.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "name": "WebODM", - "icons": [ - { - "src": "\/static\/app\/android-chrome-192x192.png", - "sizes": "192x192", - "type": "image\/png" - }, - { - "src": "\/static\/app\/android-chrome-512x512.png", - "sizes": "512x512", - "type": "image\/png" - } - ], - "theme_color": "#ffffff", - "display": "standalone" -} diff --git a/app/static/app/mstile-150x150.png b/app/static/app/mstile-150x150.png deleted file mode 100644 index 9ddd5d0d3cac67aed0c45b50ec3b5190d9fe5b79..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1521 zcmZXUdpOez7{}+Ca>}LH9-YcqDU}ckWjm=+a<`dF%9BNNVn1g3$7NznVlFjucK+-+@AJIR`+nZ{eZKF1-!xBmN6qbfwu3+*O{WVE z7!XKB>%UY5D<}6#C-am=HR7z>SrDi?OMN|bi;`7H7)KO{Bi5Ty!d_2T>^axV#4n09 zqc_Zs#aSm|ZNiYC{PTw$jm4Xrn?!Z^pUN{eGREBtB$v<0q|<0nI-pej;pA`@8~;I8 z$io;~?7TzWLX#Ch_r?fc-}1VOc^!grN0e}hNJ*>}zJT3qF`1C(h(Ydx;QuKe+Yn81*@slt+K zH*Uxe2Zt3u-Z4pQOKz6N_amz=$8x9@;U-;~pT;Q9uI@%G^*hh%l7b4^^lhw(_Jyqy zi{>rQgEg}lssqGuw_P=CKQ~uNy|;gyH{u1oVmQPH!A`3vGQp85QL~3F%LC%wK6P8t zosE)q`U!AWBdj#Hisdlrld$u9)cU_lERgIpMwxX68}q~C0*u>p>P|$kpxK}2WeW+m zm!5>n)Pz;qjj3j?$ng(>otC!Lxp*d{d6;t68p(tgVdV zIzn~M$c^UUXS(*aC?7kRW|a@<)^}!~5g4r7OD{|qbo>EhEcSF)8H!#MrxAx& zO-blBS>?cDGQ%VFV+Be&xLmj95)f<@6cw%1=oualv?v`|Qq&Fjmus&W@H(^^$-0b= zOobAT2fK+@BBUe(o|Afm9V~&s%9Oi^{oL#OjPsjT-*xEwURha4>Zn7@#%R)o-WJq) zbxlUJ8PoC!-3WPnkBMn!*^$?-2q0w$4$zDD~=jFG`q~f{?6Fzz&!Et5oP9}$06r{+u{KIyZmW!S6QBu$cpqA zvnqSByfq!D*sy?BhEGLaWEyjSMOKMY@A`DzHh&9q(JinnY=ZpYkHL>0Eg;g&Nn}@s zBucoHKYRYIxKX(NIc`6Vmpu43J}Xh5$r}F_UBVGfYSgbjPR~dtl`Tbladr9j^&uDT zJVNmR&+D|L=`la3ol>Bcjcm4WhkZp$JN(+0b*; zW#<56`l0}U{np^2L0eou!X$O#Y7=J#46}LVq zf?!VBv{J1v!Vb&_dh$|Hk{~T0(HT1*jphl?OM(o5L^^gpDTk-#A_+1F61%bUnYlbi z4@sa35T_e9TI@+pwVw*q0pk3_Mk~=&f#XylenafVpVW(%7awB8RmEp%z&gK{PXFXf z|A%*LnoG}jN^tvmtIDNs0@ja=35|ot#9j-(eB~0HOpUn&zZ^rxgFx{`6N?(Z5Pc3G ze(%vPbdq2|U_*5?ygI}X;*tvmL*Nc6C*FjC4QsLR_QBq_Ey5PP7Pa=23lE&lK+;{> Vr*rNO98}1ye*wGu - - - -Created by potrace 1.11, written by Peter Selinger 2001-2013 - - - - - diff --git a/app/templates/app/base.html b/app/templates/app/base.html index d7ece283..96180dbc 100644 --- a/app/templates/app/base.html +++ b/app/templates/app/base.html @@ -1,21 +1,15 @@ - {% load i18n static %} + {% load i18n static settings %} + {% get_settings as settings %} + - - - - - - - - - - - + + + @@ -29,7 +23,8 @@ {% load render_bundle from webpack_loader %} {% render_bundle 'main' %} - {{title|default:"Login"}} - WebODM + {{title|default:"Login"}} - {{ settings.app_name }} +