You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

488 lines
17 KiB

  1. ###################################################################################
  2. #
  3. # Copyright (C) 2017 MuK IT GmbH
  4. #
  5. # This program is free software: you can redistribute it and/or modify
  6. # it under the terms of the GNU Affero General Public License as
  7. # published by the Free Software Foundation, either version 3 of the
  8. # License, or (at your option) any later version.
  9. #
  10. # This program is distributed in the hope that it will be useful,
  11. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. # GNU Affero General Public License for more details.
  14. #
  15. # You should have received a copy of the GNU Affero General Public License
  16. # along with this program. If not, see <http://www.gnu.org/licenses/>.
  17. #
  18. ###################################################################################
  19. from odoo import api, fields, models
  20. PRIMARY_XML_ID = "muk_web_branding._assets_primary_variables"
  21. PRIMARY_SCSS_URL = "/muk_web_branding/static/src/scss/primary_colors.scss"
  22. SECONDARY_XML_ID = "muk_web_branding._assets_secondary_variables"
  23. SECONDARY_SCSS_URL = "/muk_web_branding/static/src/scss/secondary_colors.scss"
  24. BOOTSTRAP_XML_ID = "muk_web_branding._assets_backend_helpers"
  25. BOOTSTRAP_SCSS_URL = "/muk_web_branding/static/src/scss/bootstrap_colors.scss"
  26. class ResConfigSettings(models.TransientModel):
  27. _inherit = 'res.config.settings'
  28. #----------------------------------------------------------
  29. # Database
  30. #----------------------------------------------------------
  31. branding_color_brand = fields.Char(
  32. string="Brand Color")
  33. branding_color_primary = fields.Char(
  34. string="Primary Color")
  35. branding_color_secondary = fields.Char(
  36. string="Secondary Color")
  37. branding_color_lightsecondary = fields.Char(
  38. string="Light Secondary Color")
  39. branding_color_text = fields.Char(
  40. string="Text Color")
  41. branding_color_muted = fields.Char(
  42. string="Muted Color")
  43. branding_color_view = fields.Char(
  44. string="View Color")
  45. branding_color_background = fields.Char(
  46. string="Form Color")
  47. branding_color_notification_error = fields.Char(
  48. string="Notification Error Color")
  49. branding_color_notification_info = fields.Char(
  50. string="Notification Info Color")
  51. branding_color_01 = fields.Char(
  52. string="Color 01")
  53. branding_color_02 = fields.Char(
  54. string="Color 02")
  55. branding_color_03 = fields.Char(
  56. string="Color 03")
  57. branding_color_04 = fields.Char(
  58. string="Color 04")
  59. branding_color_05 = fields.Char(
  60. string="Color 05")
  61. branding_color_06 = fields.Char(
  62. string="Color 06")
  63. branding_color_07 = fields.Char(
  64. string="Color 07")
  65. branding_color_08 = fields.Char(
  66. string="Color 08")
  67. branding_color_09 = fields.Char(
  68. string="Color 09")
  69. branding_color_10 = fields.Char(
  70. string="Color 10")
  71. branding_color_11 = fields.Char(
  72. string="Color 11")
  73. branding_color_12 = fields.Char(
  74. string="Color 12")
  75. branding_color_success = fields.Char(
  76. string="Success Color")
  77. branding_color_info = fields.Char(
  78. string="Info Color")
  79. branding_color_warning = fields.Char(
  80. string="Warning Color")
  81. branding_color_danger = fields.Char(
  82. string="Danger Color")
  83. branding_color_light = fields.Char(
  84. string="Light Color")
  85. branding_color_dark = fields.Char(
  86. string="Dark Color")
  87. branding_color_white = fields.Char(
  88. string="White Color")
  89. branding_color_black = fields.Char(
  90. string="Black Color")
  91. branding_color_gray_100 = fields.Char(
  92. string="Gray 100 Color")
  93. branding_color_gray_200 = fields.Char(
  94. string="Gray 200 Color")
  95. branding_color_gray_300 = fields.Char(
  96. string="Gray 300 Color")
  97. branding_color_gray_400 = fields.Char(
  98. string="Gray 400 Color")
  99. branding_color_gray_500 = fields.Char(
  100. string="Gray 500 Color")
  101. branding_color_gray_600 = fields.Char(
  102. string="Gray 600 Color")
  103. branding_color_gray_700 = fields.Char(
  104. string="Gray 700 Color")
  105. branding_color_gray_800 = fields.Char(
  106. string="Gray 800 Color")
  107. branding_color_gray_900 = fields.Char(
  108. string="Gray 900 Color")
  109. #----------------------------------------------------------
  110. # Helper
  111. #----------------------------------------------------------
  112. def _get_branding_primary_colors(self):
  113. variables = [
  114. 'o-community-color',
  115. 'o-enterprise-color',
  116. 'o-enterprise-primary-color',
  117. 'o-brand-odoo',
  118. 'o-brand-primary',
  119. 'o-gray',
  120. 'o-brand-secondary',
  121. 'o-brand-lightsecondary',
  122. 'o-main-text-color',
  123. 'o-main-color-muted',
  124. 'o-view-background-color',
  125. 'o-notification-error-bg-color',
  126. 'o-notification-info-bg-color',
  127. ]
  128. colors = self.env['muk_utils.scss_editor'].get_values(
  129. PRIMARY_SCSS_URL, PRIMARY_XML_ID, variables
  130. )
  131. if colors['o-brand-odoo'] == '$o-community-color':
  132. colors['o-brand-odoo'] = colors['o-community-color']
  133. if colors['o-brand-odoo'] == '$o-enterprise-color':
  134. colors['o-brand-odoo'] = colors['o-enterprise-color']
  135. if colors['o-brand-primary'] == '$o-community-color':
  136. colors['o-brand-primary'] = colors['o-community-color']
  137. if colors['o-brand-primary'] == '$o-enterprise-primary-color':
  138. colors['o-brand-primary'] = colors['o-enterprise-primary-color']
  139. if colors['o-brand-secondary'] == '$o-gray-100':
  140. colors['o-brand-secondary'] = colors['o-gray-100']
  141. if colors['o-brand-lightsecondary'] == '$o-gray-100':
  142. colors['o-brand-lightsecondary'] = colors['o-gray-100']
  143. if colors['o-brand-lightsecondary'] == '$o-gray-100':
  144. colors['o-brand-lightsecondary'] = colors['o-gray-100']
  145. return {
  146. 'branding_color_brand': colors['o-brand-odoo'],
  147. 'branding_color_primary': colors['o-brand-primary'],
  148. 'branding_color_secondary': colors['o-brand-secondary'],
  149. 'branding_color_lightsecondary': colors['o-brand-lightsecondary'],
  150. 'branding_color_text': colors['o-main-text-color'],
  151. 'branding_color_muted': colors['o-main-color-muted'],
  152. 'branding_color_view': colors['o-view-background-color'],
  153. 'branding_color_notification_error': colors['o-notification-error-bg-color'],
  154. 'branding_color_notification_info': colors['o-notification-info-bg-color'],
  155. }
  156. def _get_branding_secondary_colors(self):
  157. variables = [
  158. 'o-webclient-background-color',
  159. 'mk-color-01',
  160. 'mk-color-02',
  161. 'mk-color-03',
  162. 'mk-color-04',
  163. 'mk-color-05',
  164. 'mk-color-06',
  165. 'mk-color-07',
  166. 'mk-color-08',
  167. 'mk-color-09',
  168. 'mk-color-10',
  169. 'mk-color-11',
  170. 'mk-color-12',
  171. ]
  172. colors = self.env['muk_utils.scss_editor'].get_values(
  173. SECONDARY_SCSS_URL, SECONDARY_XML_ID, variables
  174. )
  175. return {
  176. 'branding_color_background': colors['o-webclient-background-color'],
  177. 'branding_color_01': colors['mk-color-01'],
  178. 'branding_color_02': colors['mk-color-02'],
  179. 'branding_color_03': colors['mk-color-03'],
  180. 'branding_color_04': colors['mk-color-04'],
  181. 'branding_color_05': colors['mk-color-05'],
  182. 'branding_color_06': colors['mk-color-06'],
  183. 'branding_color_07': colors['mk-color-07'],
  184. 'branding_color_08': colors['mk-color-08'],
  185. 'branding_color_09': colors['mk-color-09'],
  186. 'branding_color_10': colors['mk-color-10'],
  187. 'branding_color_11': colors['mk-color-11'],
  188. 'branding_color_12': colors['mk-color-12'],
  189. }
  190. def _get_branding_bootstrap_colors(self):
  191. variables = [
  192. 'success',
  193. 'info',
  194. 'warning',
  195. 'danger',
  196. 'light',
  197. 'dark',
  198. 'white',
  199. 'black',
  200. 'gray-100',
  201. 'gray-200',
  202. 'gray-300',
  203. 'gray-400',
  204. 'gray-500',
  205. 'gray-600',
  206. 'gray-700',
  207. 'gray-800',
  208. 'gray-900',
  209. ]
  210. colors = self.env['muk_utils.scss_editor'].get_values(
  211. BOOTSTRAP_SCSS_URL, BOOTSTRAP_XML_ID, variables
  212. )
  213. return {
  214. 'branding_color_success': colors['success'],
  215. 'branding_color_info': colors['info'],
  216. 'branding_color_warning': colors['warning'],
  217. 'branding_color_danger': colors['danger'],
  218. 'branding_color_light': colors['light'],
  219. 'branding_color_white': colors['white'],
  220. 'branding_color_black': colors['black'],
  221. 'branding_color_gray_100': colors['gray-100'],
  222. 'branding_color_gray_200': colors['gray-200'],
  223. 'branding_color_gray_300': colors['gray-300'],
  224. 'branding_color_gray_400': colors['gray-400'],
  225. 'branding_color_gray_500': colors['gray-500'],
  226. 'branding_color_gray_600': colors['gray-600'],
  227. 'branding_color_gray_700': colors['gray-700'],
  228. 'branding_color_gray_800': colors['gray-800'],
  229. 'branding_color_gray_900': colors['gray-900'],
  230. }
  231. def _check_branding_colors(self, colors, variables):
  232. for values in variables:
  233. if colors[values['field']] != values['value']:
  234. return True
  235. return False
  236. def _set_branding_primary_colors(self):
  237. variables = [{
  238. 'name': 'o-brand-odoo',
  239. 'field': 'branding_color_brand',
  240. 'value': self.branding_color_brand or "#7C7BAD"
  241. }, {
  242. 'name': 'o-brand-primary',
  243. 'field': 'branding_color_primary',
  244. 'value': self.branding_color_primary or "#7C7BAD"
  245. }, {
  246. 'name': 'o-brand-secondary',
  247. 'field': 'branding_color_secondary',
  248. 'value': self.branding_color_secondary or "#f0eeee"
  249. }, {
  250. 'name': 'o-brand-lightsecondary',
  251. 'field': 'branding_color_lightsecondary',
  252. 'value': self.branding_color_lightsecondary or "#e2e2e0"
  253. }, {
  254. 'name': 'o-main-text-color',
  255. 'field': 'branding_color_text',
  256. 'value': self.branding_color_text or "#4c4c4c"
  257. }, {
  258. 'name': 'o-main-color-muted',
  259. 'field': 'branding_color_muted',
  260. 'value': self.branding_color_muted or "#a8a8a8"
  261. }, {
  262. 'name': 'o-view-background-color',
  263. 'field': 'branding_color_view',
  264. 'value': self.branding_color_view or "#ffffff"
  265. }, {
  266. 'name': 'o-notification-error-bg-color',
  267. 'field': 'branding_color_notification_error',
  268. 'value': self.branding_color_notification_error or "#F16567"
  269. }, {
  270. 'name': 'o-notification-info-bg-color',
  271. 'field': 'branding_color_notification_info',
  272. 'value': self.branding_color_notification_info or "#FCFBEA"
  273. }]
  274. colors = self._get_branding_primary_colors()
  275. if self._check_branding_colors(colors, variables):
  276. self.env['muk_utils.scss_editor'].replace_values(
  277. PRIMARY_SCSS_URL, PRIMARY_XML_ID, variables
  278. )
  279. def _set_branding_secondary_colors(self):
  280. variables = [{
  281. 'name': 'o-webclient-background-color',
  282. 'field': 'branding_color_background',
  283. 'value': self.branding_color_background or "#f9f9f9"
  284. }, {
  285. 'name': 'mk-color-01',
  286. 'field': 'branding_color_01',
  287. 'value': self.branding_color_01 or "#757575"
  288. }, {
  289. 'name': 'mk-color-02',
  290. 'field': 'branding_color_02',
  291. 'value': self.branding_color_02 or "#F06050"
  292. }, {
  293. 'name': 'mk-color-03',
  294. 'field': 'branding_color_03',
  295. 'value': self.branding_color_03 or "#F4A460"
  296. }, {
  297. 'name': 'mk-color-04',
  298. 'field': 'branding_color_04',
  299. 'value': self.branding_color_04 or "#F7CD1F"
  300. }, {
  301. 'name': 'mk-color-05',
  302. 'field': 'branding_color_05',
  303. 'value': self.branding_color_05 or "#6CC1ED"
  304. }, {
  305. 'name': 'mk-color-06',
  306. 'field': 'branding_color_06',
  307. 'value': self.branding_color_06 or "#814968"
  308. }, {
  309. 'name': 'mk-color-07',
  310. 'field': 'branding_color_07',
  311. 'value': self.branding_color_07 or "#EB7E7F"
  312. }, {
  313. 'name': 'mk-color-08',
  314. 'field': 'branding_color_08',
  315. 'value': self.branding_color_08 or "#2C8397"
  316. }, {
  317. 'name': 'mk-color-09',
  318. 'field': 'branding_color_09',
  319. 'value': self.branding_color_09 or "#475577"
  320. }, {
  321. 'name': 'mk-color-10',
  322. 'field': 'branding_color_10',
  323. 'value': self.branding_color_10 or "#D6145F"
  324. }, {
  325. 'name': 'mk-color-11',
  326. 'field': 'branding_color_11',
  327. 'value': self.branding_color_11 or "#30C381"
  328. }, {
  329. 'name': 'mk-color-12',
  330. 'field': 'branding_color_12',
  331. 'value': self.branding_color_12 or "#9365B8"
  332. }]
  333. colors = self._get_branding_secondary_colors()
  334. if self._check_branding_colors(colors, variables):
  335. self.env['muk_utils.scss_editor'].replace_values(
  336. SECONDARY_SCSS_URL, SECONDARY_XML_ID, variables
  337. )
  338. def _set_branding_bootstrap_colors(self):
  339. variables = [{
  340. 'name': 'success',
  341. 'field': 'branding_color_success',
  342. 'value': self.branding_color_success or "#28a745"
  343. }, {
  344. 'name': 'info',
  345. 'field': 'branding_color_info',
  346. 'value': self.branding_color_info or "#17a2b8"
  347. }, {
  348. 'name': 'warning',
  349. 'field': 'branding_color_warning',
  350. 'value': self.branding_color_warning or "#ffc107"
  351. }, {
  352. 'name': 'danger',
  353. 'field': 'branding_color_danger',
  354. 'value': self.branding_color_danger or "#dc3545"
  355. }, {
  356. 'name': 'light',
  357. 'field': 'branding_color_light',
  358. 'value': self.branding_color_light or "#f8f9fa"
  359. }, {
  360. 'name': 'dark',
  361. 'field': 'branding_color_dark',
  362. 'value': self.branding_color_dark or "#343a40"
  363. }, {
  364. 'name': 'white',
  365. 'field': 'branding_color_white',
  366. 'value': self.branding_color_white or "#ffffff"
  367. }, {
  368. 'name': 'black',
  369. 'field': 'branding_color_black',
  370. 'value': self.branding_color_black or "#000000"
  371. }, {
  372. 'name': 'gray-100',
  373. 'field': 'branding_color_gray_100',
  374. 'value': self.branding_color_gray_100 or "#f8f9fa"
  375. }, {
  376. 'name': 'gray-200',
  377. 'field': 'branding_color_gray_200',
  378. 'value': self.branding_color_gray_200 or "#e9ecef"
  379. }, {
  380. 'name': 'gray-300',
  381. 'field': 'branding_color_gray_300',
  382. 'value': self.branding_color_gray_300 or "#dee2e6"
  383. }, {
  384. 'name': 'gray-400',
  385. 'field': 'branding_color_gray_400',
  386. 'value': self.branding_color_gray_400 or "#ced4da"
  387. }, {
  388. 'name': 'gray-500',
  389. 'field': 'branding_color_gray_500',
  390. 'value': self.branding_color_gray_500 or "#adb5bd"
  391. }, {
  392. 'name': 'gray-600',
  393. 'field': 'branding_color_gray_600',
  394. 'value': self.branding_color_gray_600 or "#6c757d"
  395. }, {
  396. 'name': 'gray-700',
  397. 'field': 'branding_color_gray_700',
  398. 'value': self.branding_color_gray_700 or "#495057"
  399. }, {
  400. 'name': 'gray-800',
  401. 'field': 'branding_color_gray_800',
  402. 'value': self.branding_color_gray_800 or "#343a40"
  403. }, {
  404. 'name': 'gray-900',
  405. 'field': 'branding_color_gray_900',
  406. 'value': self.branding_color_gray_900 or "#212529"
  407. }]
  408. colors = self._get_branding_bootstrap_colors()
  409. if self._check_branding_colors(colors, variables):
  410. self.env['muk_utils.scss_editor'].replace_values(
  411. BOOTSTRAP_SCSS_URL, BOOTSTRAP_XML_ID, variables
  412. )
  413. #----------------------------------------------------------
  414. # Functions
  415. #----------------------------------------------------------
  416. @api.model
  417. def get_values(self):
  418. res = super(ResConfigSettings, self).get_values()
  419. res.update(self._get_branding_primary_colors())
  420. res.update(self._get_branding_secondary_colors())
  421. res.update(self._get_branding_bootstrap_colors())
  422. return res
  423. @api.multi
  424. def set_values(self):
  425. res = super(ResConfigSettings, self).set_values()
  426. self._set_branding_primary_colors()
  427. self._set_branding_secondary_colors()
  428. self._set_branding_bootstrap_colors()
  429. return res