diff --git a/.tx/config b/.tx/config index ea5bcb32df4..2fffa772f75 100644 --- a/.tx/config +++ b/.tx/config @@ -272,6 +272,11 @@ file_filter = addons/hr_expense/i18n/.po source_file = addons/hr_expense/i18n/hr_expense.pot source_lang = en +[odoo-master.hr_expense_check] +file_filter = addons/hr_expense_check/i18n/.po +source_file = addons/hr_expense_check/i18n/hr_expense_check.pot +source_lang = en + [odoo-master.hr_gamification] file_filter = addons/hr_gamification/i18n/.po source_file = addons/hr_gamification/i18n/hr_gamification.pot diff --git a/addons/account/models/account_move.py b/addons/account/models/account_move.py index 23d1257ced9..332ee089be1 100644 --- a/addons/account/models/account_move.py +++ b/addons/account/models/account_move.py @@ -889,6 +889,11 @@ class AccountMoveLine(models.Model): @api.multi def reconcile(self, writeoff_acc_id=False, writeoff_journal_id=False): + # Empty self can happen if the user tries to reconcile entries which are already reconciled. + # The calling method might have filtered out reconciled lines. + if not self: + return True + #Perform all checks on lines company_ids = set() all_accounts = [] diff --git a/addons/account/report/account_balance.py b/addons/account/report/account_balance.py index 81f5c30dedc..5bdf40ae7b1 100644 --- a/addons/account/report/account_balance.py +++ b/addons/account/report/account_balance.py @@ -50,7 +50,9 @@ class ReportTrialBalance(models.AbstractModel): res['balance'] = account_result[account.id].get('balance') if display_account == 'all': account_res.append(res) - if display_account in ['movement', 'not_zero'] and not currency.is_zero(res['balance']): + if display_account == 'not_zero' and not currency.is_zero(res['balance']): + account_res.append(res) + if display_account == 'movement' and (not currency.is_zero(res['debit']) or not currency.is_zero(res['credit'])): account_res.append(res) return account_res diff --git a/addons/account/views/account_view.xml b/addons/account/views/account_view.xml index 49c17074d44..a9bc0ae22f6 100644 --- a/addons/account/views/account_view.xml +++ b/addons/account/views/account_view.xml @@ -702,7 +702,7 @@ Bank Statement Lines account.bank.statement.line form - tree + tree,form [] {} diff --git a/addons/barcodes/static/src/js/barcode_parser.js b/addons/barcodes/static/src/js/barcode_parser.js index 1f804a40fea..0a356661cf6 100644 --- a/addons/barcodes/static/src/js/barcode_parser.js +++ b/addons/barcodes/static/src/js/barcode_parser.js @@ -102,7 +102,7 @@ var BarcodeParser = Class.extend({ ean = ean.substr(0,13); for(var n = 0, count = (13 - ean.length); n < count; n++){ - ean = ean + '0'; + ean = '0' + ean; } return ean.substr(0,12) + this.ean_checksum(ean); }, diff --git a/addons/crm/models/crm_lead.py b/addons/crm/models/crm_lead.py index 14b12a6afd2..b2cee19bb1b 100644 --- a/addons/crm/models/crm_lead.py +++ b/addons/crm/models/crm_lead.py @@ -276,6 +276,11 @@ class Lead(models.Model): if vals.get('user_id') and 'date_open' not in vals: vals['date_open'] = fields.Datetime.now() + + if context.get('default_partner_id') and not vals.get('email_from'): + partner = self.env['res.partner'].browse(context['default_partner_id']) + vals['email_from'] = partner.email + # context: no_log, because subtype already handle this return super(Lead, self.with_context(context, mail_create_nolog=True)).create(vals) diff --git a/addons/event/report/report_event_registration.py b/addons/event/report/report_event_registration.py index 14f8f33a95a..b2c4d9db3e8 100644 --- a/addons/event/report/report_event_registration.py +++ b/addons/event/report/report_event_registration.py @@ -27,13 +27,8 @@ class ReportEventRegistration(models.Model): name_registration = fields.Char('Participant / Contact Name', readonly=True) company_id = fields.Many2one('res.company', 'Company', readonly=True) - @api.model_cr - def init(self): - """Initialize the sql view for the event registration """ - tools.drop_view_if_exists(self.env.cr, 'report_event_registration') - - # TOFIX this request won't select events that have no registration - self.env.cr.execute(""" CREATE VIEW report_event_registration AS ( + def _select(self): + return """ SELECT e.id::varchar || '/' || coalesce(r.id::varchar,'') AS id, e.id AS event_id, @@ -51,10 +46,17 @@ class ReportEventRegistration(models.Model): e.seats_max AS seats_max, e.state AS event_state, r.state AS registration_state + """ + + def _from(self): + return """ FROM event_event e LEFT JOIN event_registration r ON (e.id=r.event_id) + """ + def _group_by(self): + return """ GROUP BY event_id, r.id, @@ -67,5 +69,13 @@ class ReportEventRegistration(models.Model): e.company_id, e.seats_max, name_registration + """ + + @api.model_cr + def init(self): + tools.drop_view_if_exists(self.env.cr, self._table) + self.env.cr.execute( + "CREATE or REPLACE VIEW %s as (%s %s %s)" % ( + self._table, self._select(), self._from(), self._group_by(), + ) ) - """) diff --git a/addons/l10n_ch/data/l10n_ch_chart_data.xml b/addons/l10n_ch/data/l10n_ch_chart_data.xml index 4a34a581a9f..5569b2fafb0 100644 --- a/addons/l10n_ch/data/l10n_ch_chart_data.xml +++ b/addons/l10n_ch/data/l10n_ch_chart_data.xml @@ -13,7 +13,7 @@ Plan comptable 2015 - 1 + 4 102 100 diff --git a/addons/l10n_fr/data/account_chart_template_data.xml b/addons/l10n_fr/data/account_chart_template_data.xml index 429e5b3030e..9b961ff1e6a 100644 --- a/addons/l10n_fr/data/account_chart_template_data.xml +++ b/addons/l10n_fr/data/account_chart_template_data.xml @@ -216,7 +216,7 @@ - Actionnaires: capital souscrit - non appelé + Actionnaires : capital souscrit - non appelé 109 @@ -251,56 +251,56 @@ - État + Subventions d'équipement - État 1311 - Régions + Subventions d'équipement - Régions 1312 - Départements + Subventions d'équipement - Départements 1313 - Communes + Subventions d'équipement - Communes 1314 - Collectivités publiques + Subventions d'équipement - Collectivités publiques 1315 - Entreprises publiques + Subventions d'équipement - Entreprises publiques 1316 - Entreprises et organismes privés + Subventions d'équipement - Entreprises et organismes privés 1317 - Autres + Subventions d'équipement - Autres 1318 @@ -314,56 +314,56 @@ - Etat + Subventions d'équipement inscrites au compte de résultat - État 13911 - Régions + Subventions d'équipement inscrites au compte de résultat - Régions 13912 - Départements + Subventions d'équipement inscrites au compte de résultat - Départements 13913 - Communes + Subventions d'équipement inscrites au compte de résultat - Communes 13914 - Collectivités publiques + Subventions d'équipement inscrites au compte de résultat - Collectivités publiques 13915 - Entreprises publiques + Subventions d'équipement inscrites au compte de résultat - Entreprises publiques 13916 - Entreprises et organismes privés + Subventions d'équipement inscrites au compte de résultat - Entreprises et organismes privés 13917 - Autres + Subventions d'équipement inscrites au compte de résultat - Autres 13918 @@ -391,14 +391,14 @@ - Hausse des prix + Provisions réglementées relatives aux stocks - Hausse de prix 1431 - Fluctuation des cours + Provisions réglementées relatives aux stocks - Fluctuation des cours 1432 @@ -517,7 +517,7 @@ - Provisions pour gros entretien ou grandes révisions + Provisions pour charges à répartir sur plusieurs exercices - Gros entretien ou grandes révisions 1572 @@ -538,7 +538,7 @@ - Autres emprunts obligataires + Autres emprunts obligataires 163 @@ -566,105 +566,105 @@ - Comptes bloqués + Participation des salariés aux résultats - Comptes bloqués 1661 - Fonds de participation + Participation des salariés aux résultats - Fonds de participation 1662 - Emissions de titres participatifs + Emprunts et dettes assortis de conditions particulières - Emissions de titres participatifs 1671 - Avances conditionnées de l'État + Emprunts et dettes assortis de conditions particulières - Avances conditionnées de l'État 1674 - Emprunts participatifs + Emprunts et dettes assortis de conditions particulières - Emprunts participatifs 1675 - Autres emprunts + Autres emprunts et dettes assimilées - Autres emprunts 1681 - Rentes viagères capitalisées + Autres emprunts et dettes assimilées - Rentes viagères capitalisées 1685 - Autres dettes + Autres emprunts et dettes assimilées - Autres dettes 1687 - Sur emprunts obligataires convertibles + Intérêts courus sur emprunts obligataires convertibles 16881 - Sur autres emprunts obligataires + Intérêts courus sur autres emprunts obligataires 16883 - Sur emprunts auprès des établissements de crédit + Intérêts courus sur emprunts auprès des établissements de crédit 16884 - Sur dépôts et cautionnements reçus + Intérêts courus sur dépôts et cautionnements reçus 16885 - Sur participation des salariés aux résultats + Intérêts courus sur participation des salariés aux résultats 16886 - Sur emprunts et dettes assortis de conditions particulières + Intérêts courus sur emprunts et dettes assortis de conditions particulières 16887 - Sur autres emprunts et dettes assimilées + Intérêts courus sur autres emprunts et dettes assimilées 16888 @@ -692,14 +692,14 @@ - Principal + Dettes rattachées à des sociétés en participation - Principal 1781 - Intérêts courus + Dettes rattachées à des sociétés en participation - Intérêts courus 1788 @@ -734,56 +734,56 @@ - Frais de constitution + Immobilisations incorporelles - Frais d'établissement - Frais de constitution 2011 - Frais de prospection + Immobilisations incorporelles - Frais d'établissement - Frais de prospection 20121 - Frais de publicité + Immobilisations incorporelles - Frais d'établissement - Frais de publicité 20122 - Frais d'augmentation de capital et d'opérations diverses (fusions, scissions, transformations) + Immobilisations incorporelles - Frais d'augmentation de capital et d'opérations diverses (fusions, scissions, transformations) 2013 - Frais de recherche et de développement + Immobilisations incorporelles - Frais de recherche et de développement 203 - Concessions et droits similaires, brevets, licences, marques, procédés, logiciels, droits et valeurs similaires + Immobilisations incorporelles - Concessions et droits similaires, brevets, licences, marques, procédés, logiciels, droits et valeurs similaires 205 - Droit au bail + Immobilisations incorporelles - Droit au bail 206 - Fonds commercial + Immobilisations incorporelles - Fonds commercial 207 @@ -797,238 +797,238 @@ - Terrains nus + Immobilisations corporelles - Terrains nus 2111 - Terrains aménagés + Immobilisations corporelles - Terrains aménagés 2112 - Sous-sols et sur-sols + Immobilisations corporelles - Sous-sols et sur-sols 2113 - Carrières + Immobilisations corporelles - Carrières 21141 - Ensembles immobiliers industriels (A, B, ...) + Immobilisations corporelles - Terrains bâtis - Ensembles immobiliers industriels 21151 - Ensembles immobiliers administratifs et commerciaux (A, B, ...) + Immobilisations corporelles - Terrains bâtis - Ensembles immobiliers administratifs et commerciaux 21155 - Affectés aux opérations professionnelles (A, B, ...) + Immobilisations corporelles - Terrains bâtis affectés aux opérations professionnelles 211581 - Affectés aux opérations non professionnelles (A, B, ...) + Immobilisations corporelles - Terrains bâtis affectés aux opérations non professionnelles 211588 - Compte d'ordre sur immobilisations + Immobilisations corporelles - Compte d'ordre sur immobilisations 2116 - Agencements et aménagements de terrains (même ventilation que celle du compte 211) + Immobilisations corporelles - Agencements et aménagements de terrains (même ventilation que celle du compte 211) 212 - Ensembles immobiliers industriels (A, B, ...) + Immobilisations corporelles - Bâtiments - Ensembles immobiliers industriels 21311 - Ensembles immobiliers administratifs et commerciaux (A, B, ...) + Immobilisations corporelles - Bâtiments - Ensembles immobiliers administratifs et commerciaux 21315 - Affectés aux opérations professionnelles (A, B, ...) + Immobilisations corporelles - Bâtiments affectés aux opérations professionnelles 213181 - Affectés aux opérations non professionnelles (A, B, ...) + Immobilisations corporelles - Bâtiments affectés aux opérations non professionnelles 213188 - Installations générales agencements aménagements des constructions (même ventilation que celle du compte 2131) + Immobilisations corporelles - Installations générales, agencements, aménagements des constructions (même ventilation que celle du compte 2131) 2135 - Voies de terre + Immobilisations corporelles - Ouvrages d'infrastructure - Voies de terre 21381 - Voies de fer + Immobilisations corporelles - Ouvrages d'infrastructure - Voies de fer 21382 - Voies d'eau + Immobilisations corporelles - Ouvrages d'infrastructure - Voies d'eau 21383 - Barrages + Immobilisations corporelles - Ouvrages d'infrastructure - Barrages 21384 - Pistes d'aérodromes + Immobilisations corporelles - Ouvrages d'infrastructure - Pistes d'aérodromes 21385 - Constructions sur sol d'autrui (même ventilation que celle du compte 213) + Immobilisations corporelles - Constructions sur sol d'autrui (même ventilation que celle du compte 213) 214 - Sur sol propre + Immobilisations corporelles - Installations complexes spécialisées sur sol propre 21511 - Sur sol d'autrui + Immobilisations corporelles - Installations complexes spécialisées sur sol d'autrui 21514 - Sur sol propre + Immobilisations corporelles - Installations à caractère spécifique sur sol propre 21531 - Sur sol d'autrui + Immobilisations corporelles - Installations à caractère spécifique sur sol d'autrui 21534 - Matériel industriel + Immobilisations corporelles - Matériels industriels 2154 - Outillage industriel + Immobilisations corporelles - Outillage industriel 2155 - Agencements et aménagements du matériel et outillage industriels + Immobilisations corporelles - Agencements et aménagements des matériels et outillage industriels 2157 - Installations générales agencements aménagements divers + Immobilisations corporelles - Installations générales agencements aménagements divers 2181 - Matériel de transport + Immobilisations corporelles - Matériel de transport 2182 - Matériel de bureau et matériel informatique + Immobilisations corporelles - Matériel de bureau et matériel informatique 2183 - Mobilier + Immobilisations corporelles - Mobilier 2184 - Cheptel + Immobilisations corporelles - Cheptel 2185 - Emballages récupérables + Immobilisations corporelles - Emballages récupérables 2186 @@ -1042,7 +1042,7 @@ - Terrains + Immobilisations corporelles en cours - Terrains 2312 Pas d'amortissement sur les terrains @@ -1050,28 +1050,28 @@ - Constructions + Immobilisations corporelles en cours - Constructions 2313 - Installations techniques matériel et outillage industriels + Immobilisations corporelles en cours - Installations techniques matériel et outillage industriels 2315 - Autres immobilisations corporelles + Autres immobilisations corporelles en cours 2318 - Immobilisations incorporelles en cours + Immobilisations incorporelles en cours 232 @@ -1085,28 +1085,28 @@ - Terrains + Avances et acomptes versés sur commandes d'immobilisations corporelles - Terrains 2382 - Constructions + Avances et acomptes versés sur commandes d'immobilisations corporelles - Constructions 2383 - Installations techniques matériel et outillage industriels + Avances et acomptes versés sur commandes d'immobilisations corporelles - Installations techniques matériel et outillage industriels 2385 - Autres immobilisations corporelles + Avances et acomptes versés sur commandes d'immobilisations corporelles - Autres immobilisations corporelles 2388 @@ -1120,14 +1120,14 @@ - Actions + Titres de participation - Actions 2611 - Autres titres + Autres titres de participation 2618 @@ -1178,28 +1178,28 @@ - Autres créances rattachées à des participations + Autres créances rattachées à des participations 2677 - Intérêts courus + Créances rattachées à des participations - Intérêts courus 2678 - Principal + Créances rattachées à des sociétés en participation - Principal 2681 - Intérêts courus + Créances rattachées à des sociétés en participation - Intérêts courus 2688 @@ -1213,35 +1213,35 @@ - Actions + Titres immobilisés autres que les titres immobilisés de l'activité de portefeuille - Actions 2711 - Autres titres + Titres immobilisés autres que les titres immobilisés de l'activité de portefeuille - Autres titres 2718 - Obligations + Titres immobilisés - Obligations 2721 - Bons + Titres immobilisés - Bons 2722 - Titres immobilisés de l'activité de portefeuille (TIAP) + Titres immobilisés de l'activité de portefeuille 273 @@ -1290,35 +1290,35 @@ - Créances diverses + Autres créances immobilisées - Créances diverses 2761 - Sur titres immobilisés (droits de créance) + Autres créances immobilisées - Intérêts courus sur titres immobilisés (droits de créance) 27682 - Sur prêts + Autres créances immobilisées - Intérêts courus sur prêts 27684 - Sur dépôts et cautionnements + Autres créances immobilisées - Intérêts courus sur dépôts et cautionnements 27685 - Sur créances diverses + Autres créances immobilisées - Intérêts courus sur créances diverses 27688 @@ -1346,77 +1346,77 @@ - Frais d'établissement (même ventilation que celle du compte 201) + Amortissements des immobilisations incorporelles - Frais d'établissement (même ventilation que celle du compte 201) 2801 - Frais de recherche et de développement + Amortissements des immobilisations incorporelles - Frais de recherche et de développement 2803 - Concessions et droits similaires, brevets, licences, logiciels, droits et valeurs similaires + Amortissements des immobilisations incorporelles - Concessions et droits similaires, brevets, licences, logiciels, droits et valeurs similaires 2805 - Fonds commercial + Amortissements des immobilisations incorporelles - Fonds commercial 2807 - Autres immobilisations incorporelles + Amortissements des autres immobilisations incorporelles 2808 - Terrains de gisement + Amortissements des immobilisations corporelles - Terrains de gisement 2811 - Agencements aménagements de terrains (même ventilation que celle du compte 212) + Amortissements des immobilisations corporelles - Agencements aménagements de terrains (même ventilation que celle du compte 212) 2812 - Constructions (même ventilation que celle du compte 213) + Amortissements des immobilisations corporelles - Constructions (même ventilation que celle du compte 213) 2813 - Constructions sur sol d'autrui (même ventilation que celle du compte 214) + Amortissements des immobilisations corporelles - Constructions sur sol d'autrui (même ventilation que celle du compte 214) 2814 - Installations matériel et outillage industriels (même ventilation que celle du compte 215) + Amortissements des immobilisations corporelles - Installations matériel et outillage industriels (même ventilation que celle du compte 215) 2815 - Autres immobilisations corporelles (même ventilation que celle du compte 218) + Amortissements des autres immobilisations corporelles (même ventilation que celle du compte 218) 2818 @@ -1430,35 +1430,35 @@ - Marques, procédés, droits et valeurs similaires + Dépréciations des immobilisations incorporelles - Marques, procédés, droits et valeurs similaires 2905 - Droit au bail + Dépréciations des immobilisations incorporelles - Droit au bail 2906 - Fonds commercial + Dépréciations des immobilisations incorporelles - Fonds commercial 2907 - Autres immobilisations incorporelles + Dépréciations des autres immobilisations incorporelles 2908 - Terrains (autres que terrains de gisement) + Dépréciations des immobilisations corporelles - Terrains (autres que terrains de gisement) 2911 @@ -1472,97 +1472,97 @@ - Immobilisations corporelles en cours + Dépréciations des immobilisations corporelles en cours 2931 - Immobilisations incorporelles en cours + Dépréciations des immobilisations incorporelles en cours 2932 - Titres de participation + Provisions pour dépréciation des titres de participation 2961 - Autres formes de participation + Provisions pour dépréciation des autres formes de participation 2966 - Créances rattachées à des participations (même ventilation que celle du compte 267) + Provisions pour dépréciation des créances rattachées à des participations (même ventilation que celle du compte 267) 2967 - Créances rattachées à des sociétés en participation (même ventilation que celle du compte 268) + Provisions pour dépréciation des créances rattachées à des sociétés en participation (même ventilation que celle du compte 268) 2968 - Titres immobilisés autres que les titres immobilisés de l'activité de portefeuille - droit de propriété (ventilation : 271) + Provisions pour dépréciation des titres immobilisés autres que les titres immobilisés de l'activité de portefeuille - droit de propriété (ventilation : 271) 2971 - Titres immobilisés - droit de créance (même ventilation que celle du compte 272) + Provisions pour dépréciation des titres immobilisés - droit de créance (même ventilation que celle du compte 272) 2972 - Titres immobilisés de l'activité de portefeuille + Provisions pour dépréciation des titres immobilisés de l'activité de portefeuille 2973 - Prêts (même ventilation que celle du compte 274) + Provisions pour dépréciation des prêts (même ventilation que celle du compte 274) 2974 - Dépôts et cautionnements versés (même ventilation que celle du compte 275) + Provisions pour dépréciation des dépôts et cautionnements versés (même ventilation que celle du compte 275) 2975 - Autres créances immobilisées (même ventilation que celle du compte 276) + Provisions pour dépréciation des autres créances immobilisées (même ventilation que celle du compte 276) 2976 - Matière (ou groupe) A + Matières premières (ou groupe) A 311 - Matière (ou groupe) B + Matières premières (ou groupe) B 312 @@ -1576,14 +1576,14 @@ - Matière (ou groupe) C + Matières consommables (ou groupe) C 3211 - Matière (ou groupe) D + Matières consommables (ou groupe) D 3212 @@ -1688,63 +1688,63 @@ - Prestations de services S 1 + Prestations de services en cours S 1 3451 - Prestations de services S 2 + Prestations de services en cours S 2 3452 - Produits intermédiaires (ou groupe) A + Stocks produits intermédiaires (ou groupe) A 3511 - Produits intermédiaires (ou groupe) B + Stocks produits intermédiaires (ou groupe) B 3512 - Produits finis (ou groupe) A + Stocks produits finis (ou groupe) A 3551 - Produits finis (ou groupe) B + Stocks produits finis (ou groupe) B 3552 - Déchets + Stocks produits résiduels - Déchets 3581 - Rebuts + Stocks produits résiduels - Rebuts 3585 - Matières de récupération + Stocks produits résiduels - Matières de récupération 3586 @@ -1758,14 +1758,14 @@ - Marchandises (ou groupe) A + Stocks de marchandises (ou groupe) A 371 - Marchandises (ou groupe) B + Stocks de marchandises (ou groupe) B 372 @@ -1779,105 +1779,105 @@ - Matières (ou groupe) A + Provisions pour dépréciation des matières premières (ou groupe) A 3911 - Matières (ou groupe) B + Provisions pour dépréciation des matières premières (ou groupe) B 3912 - Fournitures A, B, C, .. + Provisions pour dépréciation des fournitures A, B, C, .. 3917 - Matières consommables (même ventilation que celle du compte 321) + Provisions pour dépréciation des matières consommables (même ventilation que celle du compte 321) 3921 - Fournitures consommables (même ventilation que celle du compte 322) + Provisions pour dépréciation des fournitures consommables (même ventilation que celle du compte 322) 3922 - Emballages (même ventilation que celle du compte 326) + Provisions pour dépréciation des emballages (même ventilation que celle du compte 326) 3926 - Produits en cours (même ventilation que celle du compte 331) + Provisions pour dépréciation des produits en cours (même ventilation que celle du compte 331) 3931 - Travaux en cours (même ventilation que celle du compte 335) + Provisions pour dépréciation des travaux en cours (même ventilation que celle du compte 335) 3935 - Études en cours (même ventilation que celle du compte 341) + Provisions pour dépréciation des études en cours (même ventilation que celle du compte 341) 3941 - Prestations de services en cours (même ventilation que celle du compte 345) + Provisions pour dépréciation des prestations de services en cours (même ventilation que celle du compte 345) 3945 - Produits intermédiaires (même ventilation que celle du compte 351) + Provisions pour dépréciation des produits intermédiaires (même ventilation que celle du compte 351) 3951 - Produits finis (même ventilation que celle du compte 355) + Provisions pour dépréciation des produits finis (même ventilation que celle du compte 355) 3955 - Marchandises (ou groupe) A + Provisions pour dépréciation des stocks de marchandises (ou groupe) A 3971 - Marchandises (ou groupe) B + Provisions pour dépréciation des stocks de marchandises (ou groupe) B 3972 - Fournisseurs et comptes rattachés + Fournisseurs et comptes rattachés 400 @@ -1933,7 +1933,7 @@ - Fournisseurs + Factures non parvenues - Fournisseurs 4081 @@ -1941,7 +1941,7 @@ - Fournisseurs d'immobilisations + Factures non parvenues - Fournisseurs d'immobilisations 4084 @@ -1949,7 +1949,7 @@ - Fournisseurs - Intérêts courus + Factures non parvenues - Fournisseurs - Intérêts courus 4088 @@ -1957,7 +1957,7 @@ - Fournisseurs - Créances pour emballages et matériel à rendre + Fournisseurs débiteurs - Créances pour emballages et matériel à rendre 4096 @@ -1965,7 +1965,7 @@ - Fournisseurs d'exploitation + Fournisseurs débiteurs - Autres avoirs des fournisseurs d'exploitation 40971 @@ -1973,7 +1973,7 @@ - Fournisseurs d'immobilisations + Fournisseurs débiteurs - Autres avoirs des fournisseurs d'immobilisations 40974 @@ -1981,7 +1981,7 @@ - Rabais, remises, ristournes à obtenir et autres avoirs non encore reçus + Fournisseurs débiteurs - Rabais, remises, ristournes à obtenir et autres avoirs non encore reçus 4098 @@ -1989,7 +1989,7 @@ - Clients et comptes rattachés + Clients et comptes rattachés 410 @@ -2030,7 +2030,7 @@ - Clients - Factures à établir + Clients - Factures à établir 4181 @@ -2038,7 +2038,7 @@ - Clients - Intérêts courus + Clients - Intérêts courus non encore facturés 4188 @@ -2046,7 +2046,7 @@ - Clients - Avances et acomptes reçus sur commandes + Clients créditeurs - Avances et acomptes reçus sur commandes 4191 @@ -2054,7 +2054,7 @@ - Clients - Dettes pour emballages et matériels consignés + Clients créditeurs - Dettes pour emballages et matériels consignés 4196 @@ -2062,7 +2062,7 @@ - Clients - Autres avoirs + Clients créditeurs - Autres avoirs 4197 @@ -2070,7 +2070,7 @@ - Rabais, remises, ristournes à accorder et autres avoirs à établir + Clients créditeurs - Rabais, remises, ristournes à accorder et autres avoirs à établir 4198 @@ -2086,7 +2086,7 @@ - Comités d'entreprise d'établissement + Comités d'entreprise, d'établissement 422 @@ -2094,7 +2094,7 @@ - Réserve spéciale + Participation des salariés aux résultats - Réserve spéciale 4246 @@ -2102,7 +2102,7 @@ - Comptes courants + Participation des salariés aux résultats - Comptes courants 4248 @@ -2134,7 +2134,7 @@ - Dettes provisionnées pour congés à payer + Personnel - Dettes provisionnées pour congés à payer 4282 @@ -2142,7 +2142,7 @@ - Dettes provisionnées pour participation des salariés aux résultats + Personnel - Dettes provisionnées pour participation des salariés aux résultats 4284 @@ -2150,7 +2150,7 @@ - Autres charges à payer + Personnel - Autres charges à payer 4286 @@ -2158,7 +2158,7 @@ - Produits à recevoir + Personnel - Produits à recevoir 4287 @@ -2182,7 +2182,7 @@ - Charges sociales sur congés à payer + Charges sociales sur congés à payer 4382 @@ -2190,7 +2190,7 @@ - Autres charges à payer + Organismes sociaux - Autres charges à payer 4386 @@ -2198,7 +2198,7 @@ - Produits à recevoir + Organismes sociaux - Produits à recevoir 4387 @@ -2206,7 +2206,7 @@ - Subventions d'investissement + État - Subventions à recevoir - Subventions d'investissement 4411 @@ -2214,7 +2214,7 @@ - Subventions d'exploitation + État - Subventions à recevoir - Subventions d'exploitation 4417 @@ -2222,7 +2222,7 @@ - Subventions d'équilibre + État - Subventions à recevoir - Subventions d'équilibre 4418 @@ -2230,7 +2230,7 @@ - Avances sur subventions + État - Subventions à recevoir - Avances sur subventions 4419 @@ -2238,7 +2238,7 @@ - Obligataires + État - Impôts et taxes recouvrables sur des tiers - Obligataires 4424 @@ -2246,7 +2246,7 @@ - Associés + État - Impôts et taxes recouvrables sur des tiers - Associés 4425 @@ -2262,7 +2262,7 @@ - Intérêts courus sur créances figurant au compte 4431 + État - Intérêts courus sur créances figurant au compte 4431 4438 @@ -2315,14 +2315,14 @@ - TVA sur immobilisations + TVA déductible sur immobilisations 44562 - TVA transférée par d'autres entreprises + TVA déductible transférée par d'autres entreprises 44563 @@ -2330,7 +2330,7 @@ - TVA sur autres biens et services + TVA déductible sur autres biens et services 44566 @@ -2353,7 +2353,7 @@ - Taxes assimilées à la TVA + Taxes déductibles assimilées à la TVA 44568 @@ -2382,7 +2382,7 @@ - Taxes assimilées à la TVA + Taxes collectées assimilées à la TVA 44578 @@ -2454,7 +2454,7 @@ - Charges fiscales sur congés à payer + État - Charges fiscales sur congés à payer 4482 @@ -2462,7 +2462,7 @@ - Charges à payer + État - Charges à payer 4486 @@ -2470,7 +2470,7 @@ - Produits à recevoir + État - Produits à recevoir 4487 @@ -2493,17 +2493,8 @@ - - Associés - Comptes courants - 455 - - Pour frais avancés personnellement - - - - - Principal + Associés - Comptes courants - Principal 4551 @@ -2511,7 +2502,7 @@ - Intérêts courus + Associés - Comptes courants - Intérêts courus 4558 @@ -2519,7 +2510,7 @@ - Apports en nature + Associés - Comptes d'apport en société - Apports en nature 45611 @@ -2527,7 +2518,7 @@ - Apports en numéraire + Associés - Comptes d'apport en société - Apports en numéraire 45615 @@ -2591,7 +2582,7 @@ - Opérations courantes + Associés - Opérations faites en commun et en GIE - Opérations courantes 4581 @@ -2599,7 +2590,7 @@ - Intérêts courus + Associés - Opérations faites en commun et en GIE - Intérêts courus 4588 @@ -2653,48 +2644,16 @@ - - Comptes d'attente 1 - 472 - - - - - - - Comptes d'attente 2 - 473 - - - - - - - Comptes d'attente 3 - 474 - - - - - - - Comptes d'attente 4 - 475 - - - - - - - Comptes d'attente 5 - 476 + + Compte d'attente + 471 - Diminution des créances + Différence de conversion - Actif - Diminution des créances 4761 @@ -2702,7 +2661,7 @@ - Augmentation des dettes + Différence de conversion - Actif - Augmentation des dettes 4762 @@ -2710,7 +2669,7 @@ - Différences compensées par couverture de change + Différence de conversion - Actif - Différences compensées par couverture de change 4768 @@ -2718,7 +2677,7 @@ - Augmentation des créances + Différences de conversion - Passif - Augmentation des créances 4771 @@ -2726,7 +2685,7 @@ - Diminution des dettes + Différences de conversion - Passif - Diminution des dettes 4772 @@ -2734,7 +2693,7 @@ - Différences compensées par couverture de change + Différences de conversion - Passif - Différences compensées par couverture de change 4778 @@ -2749,7 +2708,7 @@ - Frais d'émission des emprunts + Charges à répartir sur plusieurs exercices - Frais d'émission des emprunts 4816 @@ -2773,7 +2732,7 @@ - Charges + Comptes de répartition périodique des charges 4886 @@ -2781,7 +2740,7 @@ - Produits + Comptes de répartition périodique des produits 4887 @@ -2797,7 +2756,7 @@ - Dépréciation des comptes de clients + Provisions pour dépréciation des comptes de clients 491 @@ -2805,7 +2764,7 @@ - Comptes du groupe + Provisions pour dépréciation des comptes du groupe 4951 @@ -2813,7 +2772,7 @@ - Comptes courants des associés + Provisions pour dépréciation des comptes courants des associés 4955 @@ -2821,7 +2780,7 @@ - Opérations faites en commun et en GIE + Provisions pour dépréciation des opérations faites en commun et en GIE 4958 @@ -2829,7 +2788,7 @@ - Créances sur cessions d'immobilisations + Provisions pour dépréciation des créances sur cessions d'immobilisations 4962 @@ -2837,7 +2796,7 @@ - Créances sur cessions de valeurs mobilières de placement + Provisions pour dépréciation des créances sur cessions de valeurs mobilières de placement 4965 @@ -2845,7 +2804,7 @@ - Autres comptes débiteurs + Provisions pour dépréciation - Autres comptes débiteurs 4967 @@ -2853,35 +2812,35 @@ - Parts dans entreprises liées + Valeurs mobilières de placement - Parts dans entreprises liées 501 - Actions propres + Valeurs mobilières de placement - Actions propres 502 - Titres cotés + Valeurs mobilières de placement - Titres cotés 5031 - Titres non cotés + Valeurs mobilières de placement - Titres non cotés 5035 - Autres titres conférant un droit de propriété + Valeurs mobilières de placement - Autres titres conférant un droit de propriété 504 @@ -2895,14 +2854,14 @@ - Titres cotés + Obligations cotés 5061 - Titres non cotés + Obligations non cotés 5065 @@ -2916,7 +2875,7 @@ - Autres valeurs mobilières + Autres valeurs mobilières de placement 5081 @@ -2972,7 +2931,7 @@ - Comptes en devises + Banques - Comptes en devises 5124 @@ -3021,21 +2980,21 @@ - Crédit de mobilisation de créances commerciales (CMCC) + Concours bancaires courants - Crédit de mobilisation de créances commerciales (CMCC) 5191 - Mobilisation de créances nées à l'étranger + Concours bancaires courants - Mobilisation de créances nées à l'étranger 5193 - Intérêts courus sur concours bancaires courants + Concours bancaires courants - Intérêts courus sur concours bancaires courants 5198 @@ -3084,119 +3043,119 @@ - Actions + Provisions pour dépréciation des actions 5903 - Autres titres conférant un droit de propriété + Provisions pour dépréciation des autres titres conférant un droit de propriété 5904 - Obligations + Provisions pour dépréciation des obligations 5906 - Autres valeurs mobilières de placement et créances assimilées (provisions) + Provisions pour dépréciation des autres valeurs mobilières de placement et créances assimilées (provisions) 5908 - Matières (ou groupe) A + Achats stockés - Matières premières (ou groupe) A 6011 - Matières (ou groupe) B + Achats stockés - matières premières (ou groupe) B 6012 - Fournitures A, B, C, .. + Achats stockés - Fournitures A, B, C, .. 6017 - Matières (ou groupe) C + Achats stockés - Matières consommables (ou groupe) C 60211 - Matières (ou groupe) D + Achats stockés - Matières consommables (ou groupe) D 60212 - Combustibles + Achats stockés - Combustibles 60221 - Produits d'entretien + Achats stockés - Produits d'entretien 60222 - Fournitures d'atelier et d'usine + Achats stockés - Fournitures d'atelier et d'usine 60223 - Fournitures de magasin + Achats stockés - Fournitures de magasin 60224 - Fournitures de bureau + Achats stockés - Fournitures de bureau 60225 - Emballages perdus + Achats stockés - Emballages perdus 60261 - Emballages récupérables non identifiables + Achats stockés - Emballages récupérables non identifiables 60265 - Emballages à usage mixte + Achats stockés - Emballages à usage mixte 60267 @@ -3239,7 +3198,7 @@ - Fournitures non stockables (eau, énergie...) + Fournitures non stockables (eau, énergie...) 6061 @@ -3260,14 +3219,14 @@ - Autres matières et fournitures + Achats autres matières et fournitures 6068 - Marchandise (ou groupe) A + Achats de marchandises (ou groupe) A 6071 @@ -3275,7 +3234,7 @@ - Marchandise (ou groupe) B + Achats de marchandises (ou groupe) B 6072 Pour déclaration TVA intracommunautaire @@ -3290,42 +3249,42 @@ - - de matières premières (et fournitures) + Rabais, remises et ristournes obtenus sur achats de matières premières (et fournitures) 6091 - - d'autres approvisionnements stockés + Rabais, remises et ristournes obtenus sur achats d'autres approvisionnements stockés 6092 - - d'études et prestations de services + Rabais, remises et ristournes obtenus sur achats d'études et prestations de services 6094 - - de matériel, équipements et travaux + Rabais, remises et ristournes obtenus sur achats de matériel, équipements et travaux 6095 - - d'approvisionnements non stockés + Rabais, remises et ristournes obtenus sur achats d'approvisionnements non stockés 6096 - - de marchandises + Rabais, remises et ristournes obtenus sur achats de marchandises 6097 @@ -3346,14 +3305,14 @@ - Crédit-bail mobilier + Redevances de crédit-bail mobilier 6122 - Crédit-bail immobilier + Redevances de crédit-bail immobilier 6125 @@ -3374,7 +3333,7 @@ - Malis sur emballages + Locations malis sur emballages 6136 @@ -3388,14 +3347,14 @@ - - sur biens immobiliers + Entretien et réparations sur biens immobiliers 6152 - - sur biens mobiliers + Entretien et réparations sur biens mobiliers 6155 @@ -3409,14 +3368,14 @@ - Multirisques + Assurance multirisques 6161 - Assurance obligatoire dommage construction + Assurance obligatoire dommage construction 6162 @@ -3430,7 +3389,7 @@ - Assurance transportsur ventes + Assurance transport sur ventes 61637 @@ -3444,14 +3403,14 @@ - Risques d'exploitation + Assurance risques d'exploitation 6164 - Insolvabilité clients + Assurance insolvabilité clients 6165 @@ -3507,7 +3466,7 @@ - Commissions et courtages sur achats + Commissions et courtages sur achats 6221 @@ -3549,7 +3508,7 @@ - Divers + Rémunérations d'intermédiaires et honoraires - Divers 6228 @@ -3606,7 +3565,7 @@ - Divers (pourboires, dons courants...) + Publicité, publications, relations publiques - Divers (pourboires, dons courants...) 6238 @@ -3648,7 +3607,7 @@ - Divers + Transports divers 6248 @@ -3774,7 +3733,7 @@ - Autres + Autres impôts, taxes et versements assimilés sur rémunérations (administrations des impôts) 6318 @@ -3816,15 +3775,22 @@ - Autres + Autres impôts, taxes et versements assimilés sur rémunérations (autres organismes) 6338 - - Taxe professionnelle - 63511 + + Cotisation foncière des entreprises + 635111 + + + + + + Cotisation sur la valeur ajoutée des entreprises + 635112 @@ -3851,7 +3817,7 @@ - Taxes sur le chiffre d'affaires non récupérables + Taxes sur le chiffre d'affaires non récupérables 6352 @@ -3900,7 +3866,7 @@ - Taxes diverses + Taxes diverses (autres organismes) 6378 @@ -4019,7 +3985,7 @@ - Médecine du travail pharmacie + Médecine du travail, pharmacie 6475 @@ -4040,7 +4006,7 @@ - Redevances pour concessions brevets, licences, marques, procédés, logiciels + Redevances pour concessions brevets, licences, marques, procédés, logiciels 6511 @@ -4188,14 +4154,14 @@ - Pénalités sur marchés (et dédits payés sur achats et ventes) + Charges exceptionnelles - Pénalités sur marchés (et dédits payés sur achats et ventes) 6711 - Pénalités, amendes fiscales et pénales + Charges exceptionnelles - Pénalités, amendes fiscales et pénales 6712 PV code de la route non déductibles @@ -4203,28 +4169,28 @@ - Dons, libéralités + Charges exceptionnelles - Dons, libéralités 6713 - Créances devenues irrécouvrables dans l'exercice + Charges exceptionnelles - Créances devenues irrécouvrables dans l'exercice 6714 - Subventions accordées + Charges exceptionnelles - Subventions accordées 6715 - Rappels d'impôts (autres qu'impôts sur les bénéfices) + Charges exceptionnelles - Rappels d'impôts (autres qu'impôts sur les bénéfices) 6717 @@ -4238,56 +4204,56 @@ - Charges sur exercices antérieurs (en cours d'exercice seulement) + Charges exceptionnelles sur exercices antérieurs (en cours d'exercice seulement) 672 - Immobilisations incorporelles + Valeurs comptables des éléments d'actif cédés - Immobilisations incorporelles 6751 - Immobilisations corporelles + Valeurs comptables des éléments d'actif cédés - Immobilisations corporelles 6752 - Immobilisations financières + Valeurs comptables des éléments d'actif cédés - Immobilisations financières 6756 - Autres éléments d'actif + Valeurs comptables des éléments d'actif cédés - Autres éléments d'actif 6758 - Malis provenant de clauses d'indexation + Charges exceptionnelles - Malis provenant de clauses d'indexation 6781 - Lots + Charges exceptionnelles - Lots 6782 - Malis provenant du rachat par l'entreprise d'actions et obligations émises par elle-même + Charges exceptionnelles - Malis provenant du rachat par l'entreprise d'actions et obligations émises par elle-même 6783 @@ -4301,14 +4267,14 @@ - Immobilisations incorporelles + Dotations aux amortissements sur immobilisations incorporelles 68111 - Immobilisations corporelles + Dotations aux amortissements sur immobilisations corporelles 68112 @@ -4329,28 +4295,28 @@ - Immobilisations incorporelles + Dotations aux dépréciations des immobilisations incorporelles 68161 - Immobilisations corporelles + Dotations aux dépréciations des immobilisations corporelles 68162 - Stocks et en-cours + Dotations aux dépréciations des stocks et en-cours 68173 - Créances + Dotations aux dépréciations des créances 68174 @@ -4371,21 +4337,21 @@ - Immobilisations financières + Dotations aux dépréciations des immobilisations financières 68662 - Valeurs mobilières de placement + Dotations aux dépréciations des valeurs mobilières de placement 68665 - Autres dotations + Autres dotations aux amortissements, dépréciations et provisions - Charges financières 6868 @@ -4399,21 +4365,21 @@ - Amortissements dérogatoires + Dotations aux provisions réglementées exceptionnelles (immobilisations) - Amortissements dérogatoires 68725 - Dotations aux provisions réglementées (stocks) + Dotations aux provisions réglementées exceptionnelles (stocks) 6873 - Dotations aux autres provisions réglementées + Dotations aux autres provisions réglementées exceptionnelles 6874 @@ -4441,7 +4407,7 @@ - Impôts dus en France + Impôts sur les bénéfices dus en France 6951 @@ -4455,7 +4421,7 @@ - Impôts dus à l'étranger + Impôts sur les bénéfices dus à l'étranger 6954 @@ -4497,14 +4463,14 @@ - Produits finis (ou groupe) A + Ventes de produits finis (ou groupe) A 7011 - Produits finis (ou groupe) B + Ventes de produits finis (ou groupe) B 7012 @@ -4525,49 +4491,49 @@ - Travaux de catégorie (ou activité) A + Ventes de travaux de catégorie (ou activité) A 7041 - Travaux de catégorie (ou activité) B + Ventes de travaux de catégorie (ou activité) B 7042 - Études + Ventes d'études 705 - Prestations de services + Ventes de prestations de services 706 - Marchandises (ou groupe) A + Ventes de marchandises (ou groupe) A 7071 - Marchandises (ou groupe) B + Ventes de marchandises (ou groupe) B 7072 - Marchandises à l'exportation + Ventes de marchandises à l'exportation 7073 @@ -4595,7 +4561,7 @@ - Mise à disposition de personnel facturée + Mise à disposition de personnel facturée 7084 @@ -4630,112 +4596,112 @@ - - sur ventes de produits finis + Rabais, remises et ristournes sur ventes de produits finis 7091 - - sur ventes de produits intermédiaires + Rabais, remises et ristournes sur ventes de produits intermédiaires 7092 - - sur travaux + Rabais, remises et ristournes sur travaux 7094 - - sur études + Rabais, remises et ristournes sur études 7095 - - sur prestations de services + Rabais, remises et ristournes sur prestations de services 7096 - - sur ventes de marchandises + Rabais, remises et ristournes sur ventes de marchandises 7097 - - sur produits des activités annexes + Rabais, remises et ristournes sur produits des activités annexes 7098 - Produits en cours + Variation des en-cours de production de biens - Produits en cours 71331 - Travaux en cours + Variation des en-cours de production de biens - Travaux en cours 71335 - Études en cours + Variation des en-cours de production de services - Études en cours 71341 - Prestations de services en cours + Variation des en-cours de production de services - Prestations de services en cours 71345 - Produits intermédiaires + Variation des stocks de produits intermédiaires 71351 - Produits finis + Variation des stocks de produits finis 71355 - Produits résiduels + Variation des stocks de produits résiduels 71358 - Immobilisations incorporelles + Production immobilisée - Immobilisations incorporelles 721 - Immobilisations corporelles + Production immobilisée - Immobilisations corporelles 722 @@ -4749,7 +4715,7 @@ - Redevances pour concessions, brevets, licences, marques, procédés, logiciels + Redevances pour concessions, brevets, licences, marques, procédés, logiciels 7511 @@ -4763,7 +4729,7 @@ - Autres droits et valeurs similaires + Redevances pour autres droits et valeurs similaires 7518 @@ -4819,7 +4785,7 @@ - Revenus sur autres formes de participation + Revenus sur autres formes de participation 7616 @@ -4853,7 +4819,7 @@ - Revenus des créances commerciales + Revenus des créances commerciales 7631 @@ -4903,35 +4869,35 @@ - Dédits et pénalités perçus sur achats et sur ventes + Produits exceptionnels - Dédits et pénalités perçus sur achats et sur ventes 7711 - Libéralités reçues + Produits exceptionnels - Libéralités reçues 7713 - Rentrées sur créances amorties + Produits exceptionnels - Rentrées sur créances amorties 7714 - Subventions d'équilibre + Produits exceptionnels - Subventions d'équilibre 7715 - Dégrèvements d'impôts autres qu'impôts sur les bénéfices + Produits exceptionnels - Dégrèvements d'impôts autres qu'impôts sur les bénéfices 7717 @@ -4945,63 +4911,63 @@ - Produits sur exercices antérieurs (en cours d'exercice seulement) + Produits exceptionnels sur exercices antérieurs (en cours d'exercice seulement) 772 - Immobilisations incorporelles + Produits exceptionnels des cessions d'éléments d'actif - Immobilisations incorporelles 7751 - Immobilisations corporelles + Produits exceptionnels des cessions d'éléments d'actif - Immobilisations corporelles 7752 - Immobilisations financières + Produits exceptionnels des cessions d'éléments d'actif - Immobilisations financières 7756 - Autres éléments d'actif + Produits exceptionnels des cessions d'éléments d'actif - Autres éléments d'actif 7758 - Quote-part des subventions d'investissement virée au résultat de l'exercice + Produits exceptionnels - Quote-part des subventions d'investissement virée au résultat de l'exercice 777 - Bonis provenant de clauses d'indexation + Produits exceptionnels - Bonis provenant de clauses d'indexation 7781 - Lots + Produits exceptionnels - Lots 7782 - Bonis provenant du rachat par l'entreprise d'actions et d'obligations émises par elle-même + Produits exceptionnels - Bonis provenant du rachat par l'entreprise d'actions et d'obligations émises par elle-même 7783 @@ -5015,14 +4981,14 @@ - Immobilisations incorporelles + Reprises sur amortissements des immobilisations incorporelles 78111 - Immobilisations corporelles + Reprises sur amortissements des immobilisations corporelles 78112 @@ -5036,84 +5002,84 @@ - Immobilisations incorporelles + Reprises sur dépréciations des immobilisations incorporelles 78161 - Immobilisations corporelles + Reprises sur dépréciations des immobilisations corporelles 78162 - Stocks et en-cours + Reprises sur dépréciations des actifs circulants - Stocks et en-cours 78173 - Créances + Reprises sur dépréciations des actifs circulants - Créances 78174 - Reprises sur provisions financiers + Reprises sur provisions financières 7865 - Immobilisations financières + Reprises sur dépréciations des immobilisations financières 78662 - Valeurs mobilières de placement + Reprises sur dépréciations des valeurs mobilières de placement 78665 - Amortissements dérogatoires + Reprises sur provisions réglementées (immobilisations) - Amortissements dérogatoires 78725 - Provision spéciale de réévaluation + Reprises sur provisions réglementées (immobilisations) - Provision spéciale de réévaluation 78726 - Plus-values réinvesties + Reprises sur provisions réglementées (immobilisations) - Plus-values réinvesties 78727 - Reprises sur provisions réglementées (stocks) + Reprises sur provisions réglementées (stocks) 7873 - Reprises sur autres provisions réglementées + Reprises sur autres provisions réglementées 7874 @@ -5127,7 +5093,7 @@ - Reprises pour dépréciations exceptionnelles + Reprises sur dépréciations exceptionnelles 7876 diff --git a/addons/mail/static/src/js/chat_manager.js b/addons/mail/static/src/js/chat_manager.js index 9f345d2ab8c..a7447657742 100644 --- a/addons/mail/static/src/js/chat_manager.js +++ b/addons/mail/static/src/js/chat_manager.js @@ -221,14 +221,22 @@ function make_message (data) { // can not be done in preprocess, since it alter the original value if (msg.tracking_value_ids && msg.tracking_value_ids.length) { _.each(msg.tracking_value_ids, function(f) { - if (_.contains(['date', 'datetime'], f.field_type)) { - var format = (f.field_type === 'date') ? 'LL' : 'LLL'; + if (f.field_type === 'datetime') { + var format = 'LLL'; if (f.old_value) { f.old_value = moment.utc(f.old_value).local().format(format); } if (f.new_value) { f.new_value = moment.utc(f.new_value).local().format(format); } + } else if (f.field_type === 'date') { + var format = 'LL'; + if (f.old_value) { + f.old_value = moment(f.old_value).local().format(format); + } + if (f.new_value) { + f.new_value = moment(f.new_value).local().format(format); + } } }); } diff --git a/addons/mass_mailing/models/mass_mailing.py b/addons/mass_mailing/models/mass_mailing.py index 2c1b716420f..f1bfa24db60 100644 --- a/addons/mass_mailing/models/mass_mailing.py +++ b/addons/mass_mailing/models/mass_mailing.py @@ -312,7 +312,7 @@ class MassMailing(models.Model): create_date = fields.Datetime(string='Creation Date') sent_date = fields.Datetime(string='Sent Date', oldname='date', copy=False) schedule_date = fields.Datetime(string='Schedule in the Future') - body_html = fields.Html(string='Body', translate=html_translate, sanitize_attributes=False) + body_html = fields.Html(string='Body', sanitize_attributes=False) attachment_ids = fields.Many2many('ir.attachment', 'mass_mailing_ir_attachments_rel', 'mass_mailing_id', 'attachment_id', string='Attachments') keep_archives = fields.Boolean(string='Keep Archives') diff --git a/addons/mrp/models/mrp_bom.py b/addons/mrp/models/mrp_bom.py index 6ca6f8bbf4c..f56470a5aa8 100644 --- a/addons/mrp/models/mrp_bom.py +++ b/addons/mrp/models/mrp_bom.py @@ -117,26 +117,48 @@ class MrpBom(models.Model): Quantity describes the number of times you need the BoM: so the quantity divided by the number created by the BoM and converted into its UoM """ + from collections import defaultdict + + graph = defaultdict(list) + V = set() + + def check_cycle(v, visited, recStack, graph): + visited[v] = True + recStack[v] = True + for neighbour in graph[v]: + if visited[neighbour] == False: + if check_cycle(neighbour, visited, recStack, graph) == True: + return True + elif recStack[neighbour] == True: + return True + recStack[v] = False + return False + boms_done = [(self, {'qty': quantity, 'product': product, 'original_qty': quantity, 'parent_line': False})] lines_done = [] - templates_done = product.product_tmpl_id + V |= set([product.product_tmpl_id.id]) bom_lines = [(bom_line, product, quantity, False) for bom_line in self.bom_line_ids] + for bom_line in self.bom_line_ids: + V |= set([bom_line.product_id.product_tmpl_id.id]) + graph[product.product_tmpl_id.id].append(bom_line.product_id.product_tmpl_id.id) while bom_lines: current_line, current_product, current_qty, parent_line = bom_lines[0] bom_lines = bom_lines[1:] if current_line._skip_bom_line(current_product): continue - if current_line.product_id.product_tmpl_id in templates_done: - raise UserError(_('Recursion error! A product with a Bill of Material should not have itself in its BoM or child BoMs!')) line_quantity = current_qty * current_line.product_qty bom = self._bom_find(product=current_line.product_id, picking_type=picking_type or self.picking_type_id, company_id=self.company_id.id) if bom.type == 'phantom': converted_line_quantity = current_line.product_uom_id._compute_quantity(line_quantity / bom.product_qty, bom.product_uom_id) bom_lines = [(line, current_line.product_id, converted_line_quantity, current_line) for line in bom.bom_line_ids] + bom_lines - templates_done |= current_line.product_id.product_tmpl_id + for bom_line in bom.bom_line_ids: + graph[current_line.product_id.product_tmpl_id.id].append(bom_line.product_id.product_tmpl_id.id) + if bom_line.product_id.product_tmpl_id.id in V and check_cycle(bom_line.product_id.product_tmpl_id.id, {key: False for key in V}, {key: False for key in V}, graph): + raise UserError(_('Recursion error! A product with a Bill of Material should not have itself in its BoM or child BoMs!')) + V |= set([bom_line.product_id.product_tmpl_id.id]) boms_done.append((bom, {'qty': converted_line_quantity, 'product': current_product, 'original_qty': quantity, 'parent_line': current_line})) else: # We round up here because the user expects that if he has to consume a little more, the whole UOM unit diff --git a/addons/mrp/models/mrp_production.py b/addons/mrp/models/mrp_production.py index 06786354376..904eba16eb0 100644 --- a/addons/mrp/models/mrp_production.py +++ b/addons/mrp/models/mrp_production.py @@ -269,7 +269,10 @@ class MrpProduction(models.Model): @api.model def create(self, values): if not values.get('name', False) or values['name'] == _('New'): - values['name'] = self.env['ir.sequence'].next_by_code('mrp.production') or _('New') + if values.get('picking_type_id'): + values['name'] = self.env['stock.picking.type'].browse(values['picking_type_id']).sequence_id.next_by_id() + else: + values['name'] = self.env['ir.sequence'].next_by_code('mrp.production') or _('New') if not values.get('procurement_group_id'): values['procurement_group_id'] = self.env["procurement.group"].create({'name': values['name']}).id production = super(MrpProduction, self).create(values) diff --git a/addons/mrp/models/mrp_workorder.py b/addons/mrp/models/mrp_workorder.py index 86107856873..8b5f45d3b24 100644 --- a/addons/mrp/models/mrp_workorder.py +++ b/addons/mrp/models/mrp_workorder.py @@ -391,9 +391,12 @@ class MrpWorkorder(models.Model): domain = [('workorder_id', 'in', self.ids), ('date_end', '=', False)] if not doall: domain.append(('user_id', '=', self.env.user.id)) + not_productive_timelines = timeline_obj.browse() for timeline in timeline_obj.search(domain, limit=None if doall else 1): wo = timeline.workorder_id - if timeline.loss_type != 'productive': + if wo.duration_expected <= wo.duration: + if timeline.loss_type == 'productive': + not_productive_timelines += timeline timeline.write({'date_end': fields.Datetime.now()}) else: maxdate = fields.Datetime.from_string(timeline.date_start) + relativedelta(minutes=wo.duration_expected - wo.duration) @@ -402,10 +405,12 @@ class MrpWorkorder(models.Model): timeline.write({'date_end': enddate}) else: timeline.write({'date_end': maxdate}) - loss_id = self.env['mrp.workcenter.productivity.loss'].search([('loss_type', '=', 'performance')], limit=1) - if not len(loss_id): - raise UserError(_("You need to define at least one unactive productivity loss in the category 'Performance'. Create one from the Manufacturing app, menu: Configuration / Productivity Losses.")) - timeline.copy({'date_start': maxdate, 'date_end': enddate, 'loss_id': loss_id.id}) + not_productive_timelines += timeline.copy({'date_start': maxdate, 'date_end': enddate}) + if not_productive_timelines: + loss_id = self.env['mrp.workcenter.productivity.loss'].search([('loss_type', '=', 'performance')], limit=1) + if not len(loss_id): + raise UserError(_("You need to define at least one unactive productivity loss in the category 'Performance'. Create one from the Manufacturing app, menu: Configuration / Productivity Losses.")) + not_productive_timelines.write({'loss_id': loss_id.id}) return True @api.multi diff --git a/addons/mrp/tests/test_bom.py b/addons/mrp/tests/test_bom.py index 4d54f23df0a..71421216411 100644 --- a/addons/mrp/tests/test_bom.py +++ b/addons/mrp/tests/test_bom.py @@ -131,7 +131,30 @@ class TestBoM(TestMrpCommon): self.assertEqual(set((test_bom_2 | self.bom_2).ids), set([b[0].id for b in boms])) self.assertEqual(set((test_bom_2_l1 | test_bom_2_l4 | self.bom_2.bom_line_ids).ids), set([l[0].id for l in lines])) - # check recursion - test_bom_2_l3.write({'attribute_value_ids': [(6, 0, [self.prod_attr1_v1.id])]}) + #check recursion + test_bom_3 = self.env['mrp.bom'].create({ + 'product_id': self.product_9.id, + 'product_tmpl_id': self.product_9.product_tmpl_id.id, + 'product_uom_id': self.product_9.uom_id.id, + 'product_qty': 1.0, + 'type': 'normal' + }) + test_bom_4 = self.env['mrp.bom'].create({ + 'product_id': self.product_10.id, + 'product_tmpl_id': self.product_10.product_tmpl_id.id, + 'product_uom_id': self.product_10.uom_id.id, + 'product_qty': 1.0, + 'type': 'phantom' + }) + test_bom_3_l1 = self.env['mrp.bom.line'].create({ + 'bom_id': test_bom_3.id, + 'product_id': self.product_10.id, + 'product_qty': 1.0, + }) + test_bom_4_l1 = self.env['mrp.bom.line'].create({ + 'bom_id': test_bom_4.id, + 'product_id': self.product_9.id, + 'product_qty': 1.0, + }) with self.assertRaises(exceptions.UserError): - test_bom_2.explode(self.product_7_1, 4) + test_bom_3.explode(self.product_9, 1) diff --git a/addons/mrp/views/mrp_workorder_views.xml b/addons/mrp/views/mrp_workorder_views.xml index c82e6e39ce8..6f13fdcc485 100644 --- a/addons/mrp/views/mrp_workorder_views.xml +++ b/addons/mrp/views/mrp_workorder_views.xml @@ -155,7 +155,7 @@ - + diff --git a/addons/payment_authorize/models/authorize_request.py b/addons/payment_authorize/models/authorize_request.py index f32518ff238..f31cf45801a 100644 --- a/addons/payment_authorize/models/authorize_request.py +++ b/addons/payment_authorize/models/authorize_request.py @@ -5,7 +5,9 @@ from StringIO import StringIO import xml.etree.ElementTree as ET from uuid import uuid4 +from odoo import _ from odoo.exceptions import ValidationError, UserError +from odoo import _ XMLNS = 'AnetApi/xml/v1/schema/AnetApiSchema.xsd' diff --git a/addons/payment_authorize/models/payment.py b/addons/payment_authorize/models/payment.py index 31444c38647..c7ea1d48134 100644 --- a/addons/payment_authorize/models/payment.py +++ b/addons/payment_authorize/models/payment.py @@ -8,7 +8,7 @@ import logging import time import urlparse -from odoo import api, fields, models +from odoo import _, api, fields, models from odoo.addons.payment.models.payment_acquirer import ValidationError from odoo.addons.payment_authorize.controllers.main import AuthorizeController from odoo.tools.float_utils import float_compare diff --git a/addons/point_of_sale/models/pos_order.py b/addons/point_of_sale/models/pos_order.py index fe2e07556f7..4bf0dbac8ba 100644 --- a/addons/point_of_sale/models/pos_order.py +++ b/addons/point_of_sale/models/pos_order.py @@ -848,7 +848,8 @@ class PosOrderLine(models.Model): fiscal_position_id = line.order_id.fiscal_position_id if fiscal_position_id: taxes = fiscal_position_id.map_tax(taxes, line.product_id, line.order_id.partner_id) - price = line.price_unit * (1 - (line.discount or 0.0) / 100.0) + price = self.env['account.tax']._fix_tax_included_price( + line.price_unit * (1 - (line.discount or 0.0) / 100.0), line.product_id.taxes_id, taxes) line.price_subtotal = line.price_subtotal_incl = price * line.qty if taxes: taxes = taxes.compute_all(price, currency, line.qty, product=line.product_id, partner=line.order_id.partner_id or False) diff --git a/addons/point_of_sale/static/src/css/pos.css b/addons/point_of_sale/static/src/css/pos.css index 9e75caebe0c..6f7186035d8 100644 --- a/addons/point_of_sale/static/src/css/pos.css +++ b/addons/point_of_sale/static/src/css/pos.css @@ -2347,7 +2347,6 @@ td { } .pos .popup-password .popup-input { width: 70%; - -webkit-text-security: disc; } .pos .popup .body ul, diff --git a/addons/point_of_sale/static/src/js/popups.js b/addons/point_of_sale/static/src/js/popups.js index eaeae4d6f83..f38cf18999c 100644 --- a/addons/point_of_sale/static/src/js/popups.js +++ b/addons/point_of_sale/static/src/js/popups.js @@ -307,6 +307,11 @@ var PasswordPopupWidget = NumberPopupWidget.extend({ this._super(); this.$('.popup').addClass('popup-password'); }, + click_numpad: function(event){ + this._super.apply(this, arguments); + var $value = this.$('.value'); + $value.text($value.text().replace(/./g, '•')); + }, }); gui.define_popup({name:'password', widget: PasswordPopupWidget}); diff --git a/addons/point_of_sale/tests/test_point_of_sale_flow.py b/addons/point_of_sale/tests/test_point_of_sale_flow.py index 1f63c5a02b6..976dbe5c081 100644 --- a/addons/point_of_sale/tests/test_point_of_sale_flow.py +++ b/addons/point_of_sale/tests/test_point_of_sale_flow.py @@ -138,22 +138,23 @@ class TestPointOfSaleFlow(TestPointOfSaleCommon): 'price_unit': 450, 'discount': 0.0, 'qty': 2.0, + 'tax_ids': [(6, 0, self.product3.taxes_id.ids)], }), (0, 0, { 'name': "OL/0002", 'product_id': self.product4.id, 'price_unit': 300, 'discount': 0.0, 'qty': 3.0, + 'tax_ids': [(6, 0, self.product4.taxes_id.ids)], })] }) - # I click on the "Make Payment" wizard to pay the PoS order with the total amount (2*450 + 3*300 = 1800) context_make_payment = { "active_ids": [self.pos_order_pos1.id], "active_id": self.pos_order_pos1.id } self.pos_make_payment_2 = self.PosMakePayment.with_context(context_make_payment).create({ - 'amount': 1800 + 'amount': 1845 }) # I click on the validate button to register the payment. @@ -200,22 +201,23 @@ class TestPointOfSaleFlow(TestPointOfSaleCommon): 'price_unit': 450, 'discount': 0.0, 'qty': (-2.0), + 'tax_ids': [(6, 0, self.product3.taxes_id.ids)], }), (0, 0, { 'name': "OL/0004", 'product_id': self.product4.id, 'price_unit': 300, 'discount': 0.0, 'qty': (-3.0), + 'tax_ids': [(6, 0, self.product4.taxes_id.ids)], })] }) - # I click on the "Make Payment" wizard to pay the PoS order with the total amount (-2*450 + -3*300 = -1800) context_make_payment = { "active_ids": [self.pos_order_pos2.id], "active_id": self.pos_order_pos2.id } self.pos_make_payment_3 = self.PosMakePayment.with_context(context_make_payment).create({ - 'amount': (-1800) + 'amount': (-1845) }) # I click on the validate button to register the payment. @@ -262,22 +264,23 @@ class TestPointOfSaleFlow(TestPointOfSaleCommon): 'price_unit': 450, 'discount': 0.0, 'qty': (-2.0), + 'tax_ids': [(6, 0, self.product3.taxes_id.ids)], }), (0, 0, { 'name': "OL/0006", 'product_id': self.product4.id, 'price_unit': 300, 'discount': 0.0, 'qty': 3.0, + 'tax_ids': [(6, 0, self.product4.taxes_id.ids)], })] }) - # I click on the "Make Payment" wizard to pay the PoS order with the total amount (-2*450 + 3*300 = 0) context_make_payment = { "active_ids": [self.pos_order_pos3.id], "active_id": self.pos_order_pos3.id } self.pos_make_payment_4 = self.PosMakePayment.with_context(context_make_payment).create({ - 'amount': 0 + 'amount': 45, }) # I click on the validate button to register the payment. diff --git a/addons/product/tests/common.py b/addons/product/tests/common.py index 007caf4d6bd..e48e4da9486 100644 --- a/addons/product/tests/common.py +++ b/addons/product/tests/common.py @@ -90,3 +90,13 @@ class TestProductCommon(common.SavepointCase): 'name': 'House', 'uom_id': cls.uom_unit.id, 'uom_po_id': cls.uom_unit.id}) + + cls.product_9 = Product.create({ + 'name': 'Paper', + 'uom_id': cls.uom_unit.id, + 'uom_po_id': cls.uom_unit.id}) + + cls.product_10 = Product.create({ + 'name': 'Stone', + 'uom_id': cls.uom_unit.id, + 'uom_po_id': cls.uom_unit.id}) diff --git a/addons/purchase/models/purchase.py b/addons/purchase/models/purchase.py index 2bfb42560c0..600335eb4d2 100644 --- a/addons/purchase/models/purchase.py +++ b/addons/purchase/models/purchase.py @@ -141,7 +141,7 @@ class PurchaseOrder(models.Model): picking_ids = fields.Many2many('stock.picking', compute='_compute_picking', string='Receptions', copy=False) # There is no inverse function on purpose since the date may be different on each line - date_planned = fields.Datetime(string='Scheduled Date', compute='_compute_date_planned', store=True, index=True, oldname='minimum_planned_date') + date_planned = fields.Datetime(string='Scheduled Date', compute='_compute_date_planned', store=True, index=True) amount_untaxed = fields.Monetary(string='Untaxed Amount', store=True, readonly=True, compute='_amount_all', track_visibility='always') amount_tax = fields.Monetary(string='Taxes', store=True, readonly=True, compute='_amount_all') @@ -668,7 +668,7 @@ class PurchaseOrderLine(models.Model): } # Fullfill all related procurements with this po line diff_quantity = self.product_qty - qty - for procurement in self.procurement_ids: + for procurement in self.procurement_ids.filtered(lambda p: p.state != 'cancel'): # If the procurement has some moves already, we should deduct their quantity sum_existing_moves = sum(x.product_qty for x in procurement.move_ids if x.state != 'cancel') existing_proc_qty = procurement.product_id.uom_id._compute_quantity(sum_existing_moves, procurement.product_uom) diff --git a/addons/purchase_requisition/models/purchase_requisition.py b/addons/purchase_requisition/models/purchase_requisition.py index 26193ec547b..32a013fc6d1 100644 --- a/addons/purchase_requisition/models/purchase_requisition.py +++ b/addons/purchase_requisition/models/purchase_requisition.py @@ -33,7 +33,14 @@ class PurchaseRequisition(models.Model): _order = "id desc" def _get_picking_in(self): - return self.env.ref('stock.picking_type_in') + pick_in = self.env.ref('stock.picking_type_in') + if not pick_in: + company = self.env['res.company']._company_default_get('purchase.requisition') + pick_in = self.env['stock.picking.type'].search( + [('warehouse_id.company_id', '=', company.id), ('code', '=', 'incoming')], + limit=1, + ) + return pick_in def _get_type_id(self): return self.env['purchase.requisition.type'].search([], limit=1) diff --git a/addons/rating/controllers/main.py b/addons/rating/controllers/main.py index 48278b735a1..c167a980e72 100644 --- a/addons/rating/controllers/main.py +++ b/addons/rating/controllers/main.py @@ -35,9 +35,6 @@ class Rating(http.Controller): return request.not_found() record_sudo = request.env[rating.res_model].sudo().browse(rating.res_id) record_sudo.rating_apply(rate, token=token, feedback=kwargs.get('feedback')) - # redirect to the form view if logged person - if request.session.uid: - return werkzeug.utils.redirect('/web#model=%s&id=%s&view_type=form' % (record_sudo._name, record_sudo.id)) lang = rating.partner_id.lang or 'en_US' return request.env['ir.ui.view'].with_context(lang=lang).render_template('rating.rating_external_page_view', { 'web_base_url': request.env['ir.config_parameter'].sudo().get_param('web.base.url'), diff --git a/addons/report/models/report.py b/addons/report/models/report.py index c576ced2e5d..0f0d3e13a0b 100644 --- a/addons/report/models/report.py +++ b/addons/report/models/report.py @@ -297,7 +297,7 @@ class Report(models.Model): active_ids = docids context = dict(self.env.context, active_ids=active_ids) - report = self.env['ir.actions.report.xml'].with_context(context).search([('report_name', '=', report_name)]) + report = self.env['ir.actions.report.xml'].with_context(context).search([('report_name', '=', report_name)], limit=1) if not report: raise UserError(_("Bad Report Reference") + _("This report is not loaded into the database: %s.") % report_name) diff --git a/addons/resource/models/resource.py b/addons/resource/models/resource.py index 7723b6d98f2..b500ac8213a 100644 --- a/addons/resource/models/resource.py +++ b/addons/resource/models/resource.py @@ -304,6 +304,11 @@ class ResourceCalendar(models.Model): elif start_dt is None: start_dt = datetime.datetime.now().replace(hour=0, minute=0, second=0, microsecond=0) else: + # FORWARD-PORT UP TO SAAS-14 + # Add a strict limit when searching for intervals + force_start_dt = self.env.context.get('force_start_dt') + if force_start_dt and force_start_dt < start_dt: + work_limits.append((force_start_dt.replace(hour=0, minute=0, second=0, microsecond=0), force_start_dt)) work_limits.append((start_dt.replace(hour=0, minute=0, second=0, microsecond=0), start_dt)) if end_dt is None: end_dt = start_dt.replace(hour=23, minute=59, second=59, microsecond=999999) @@ -335,7 +340,15 @@ class ResourceCalendar(models.Model): dt_t.replace(tzinfo=tz_info).astimezone(pytz.UTC).replace(tzinfo=None), calendar_working_day.id ) - working_intervals += self.interval_remove_leaves(working_interval, work_limits) + + # FORWARD-PORT UP TO SAAS-14 + # Add a strict limit when searching for intervals (yeah, once again!) + if self.env.context.get('force_start_dt'): + for wi in self.interval_remove_leaves(working_interval, work_limits): + if wi[0] >= self.env.context['force_start_dt']: + working_intervals += [wi] + else: + working_intervals += self.interval_remove_leaves(working_interval, work_limits) # find leave intervals if leaves is None and compute_leaves: @@ -423,6 +436,12 @@ class ResourceCalendar(models.Model): """ if day_dt is None: day_dt = datetime.datetime.now() + elif day_dt is not None and hours > 0: + # FORWARD-PORT UP TO SAAS-14 + # FIXME: think about a better fix... However, solved from saas-15 thanks to refactoring + # Make sure the to keep the original start date when searching for intervals, since a + # difference in day may occur depending on the TZ. + self = self.with_context(force_start_dt=day_dt) backwards = (hours < 0) hours = abs(hours) intervals = [] diff --git a/addons/resource/tests/test_resource.py b/addons/resource/tests/test_resource.py index 9fd6dddf8a8..971b9d3b575 100644 --- a/addons/resource/tests/test_resource.py +++ b/addons/resource/tests/test_resource.py @@ -477,6 +477,40 @@ class TestResource(TestResourceCommon): resource_id = self.env.ref('resource.resource_analyst').copy() self.assertTrue(resource_id, 'Unable to Duplicate Resource') + # FORWARD-PORT UP TO SAAS-14 + # Test already in Saas-15 + def test_80_resource_schedule_tz(self): + # Call schedule_hours for a user in Autralia, Sydney (GMT+10) + # Two cases: + # - start at 2013-02-15 08:00:00 => 2013-02-14 21:00:00 in UTC + # - start at 2013-02-15 11:00:00 => 2013-02-15 00:00:00 in UTC + + tz_context = dict(tz='Australia/Sydney') + self.env.user.with_context(tz_context).write({'tz': 'Australia/Sydney'}) + calendar = self.calendar.with_context(tz_context) + + self.env['resource.calendar.attendance'].create({ + 'name': 'Day3 - 1', + 'dayofweek': '3', + 'hour_from': 8, + 'hour_to': 12, + 'calendar_id': calendar.id, + }) + self.env['resource.calendar.attendance'].create({ + 'name': 'Day3 - 2', + 'dayofweek': '3', + 'hour_from': 13, + 'hour_to': 17, + 'calendar_id': calendar.id, + }) + + hours = 1.0/60.0 + start_dt = Datetime.from_string('2013-02-14 21:00:00') + res = calendar.schedule_hours(hours, start_dt) + self.assertEqual([(start_dt, start_dt.replace(minute=1))], res, 'resource_calendar: wrong schedule_hours computation') + start_dt = Datetime.from_string('2013-02-15 00:00:00') + res = calendar.schedule_hours(hours, start_dt) + self.assertEqual([(start_dt, start_dt.replace(minute=1))], res, 'resource_calendar: wrong schedule_hours computation') WAR_START = date(1932, 11, 2) WAR_END = date(1932, 12, 10) diff --git a/addons/sale/models/sale.py b/addons/sale/models/sale.py index 18680945751..534a4cd58e6 100644 --- a/addons/sale/models/sale.py +++ b/addons/sale/models/sale.py @@ -113,7 +113,7 @@ class SaleOrder(models.Model): ('cancel', 'Cancelled'), ], string='Status', readonly=True, copy=False, index=True, track_visibility='onchange', default='draft') date_order = fields.Datetime(string='Order Date', required=True, readonly=True, index=True, states={'draft': [('readonly', False)], 'sent': [('readonly', False)]}, copy=False, default=fields.Datetime.now) - validity_date = fields.Date(string='Expiration Date', readonly=True, states={'draft': [('readonly', False)], 'sent': [('readonly', False)]}, + validity_date = fields.Date(string='Expiration Date', readonly=True, copy=False, states={'draft': [('readonly', False)], 'sent': [('readonly', False)]}, help="Manually set the expiration date of your quotation (offer), or it will set the date automatically based on the template if online quotation is installed.") create_date = fields.Datetime(string='Creation Date', readonly=True, index=True, help="Date on which sales order is created.") confirmation_date = fields.Datetime(string='Confirmation Date', readonly=True, index=True, help="Date on which the sales order is confirmed.", oldname="date_confirm") diff --git a/addons/sale_margin/models/sale_order.py b/addons/sale_margin/models/sale_order.py index dfb24840f2d..90f866ecfec 100644 --- a/addons/sale_margin/models/sale_order.py +++ b/addons/sale_margin/models/sale_order.py @@ -55,7 +55,7 @@ class SaleOrderLine(models.Model): return super(SaleOrderLine, self).create(vals) - @api.depends('product_id', 'purchase_price', 'product_uom_qty', 'price_unit') + @api.depends('product_id', 'purchase_price', 'product_uom_qty', 'price_unit', 'price_subtotal') def _product_margin(self): for line in self: currency = line.order_id.pricelist_id.currency_id diff --git a/addons/stock/models/stock_pack_operation.py b/addons/stock/models/stock_pack_operation.py index 6e51a573546..5de33d40631 100644 --- a/addons/stock/models/stock_pack_operation.py +++ b/addons/stock/models/stock_pack_operation.py @@ -110,10 +110,11 @@ class PackOperation(models.Model): qty -= record.qty self.remaining_qty = float_round(qty, precision_rounding=self.product_id.uom_id.rounding) - @api.one + @api.multi def _compute_location_description(self): - self.from_loc = '%s%s' % (self.location_id.name, self.product_id and self.package_id.name or '') - self.to_loc = '%s%s' % (self.location_dest_id.name, self.result_package_id.name or '') + for operation, operation_sudo in zip(self, self.sudo()): + operation.from_loc = '%s%s' % (operation_sudo.location_id.name, operation.product_id and operation_sudo.package_id.name or '') + operation.to_loc = '%s%s' % (operation_sudo.location_dest_id.name, operation_sudo.result_package_id.name or '') @api.one def _compute_lots_visible(self): diff --git a/addons/stock/models/stock_picking.py b/addons/stock/models/stock_picking.py index cfc8a3bd38c..814d195a03b 100644 --- a/addons/stock/models/stock_picking.py +++ b/addons/stock/models/stock_picking.py @@ -779,6 +779,8 @@ class Picking(models.Model): @api.multi def do_new_transfer(self): for pick in self: + if pick.state == 'done': + raise UserError(_('The pick is already validated')) pack_operations_delete = self.env['stock.pack.operation'] if not pick.move_lines and not pick.pack_operation_ids: raise UserError(_('Please create some Initial Demand or Mark as Todo and create some Operations. ')) diff --git a/addons/stock/tests/test_stock_flow.py b/addons/stock/tests/test_stock_flow.py index 32f77c06267..415214b7ca5 100644 --- a/addons/stock/tests/test_stock_flow.py +++ b/addons/stock/tests/test_stock_flow.py @@ -1576,7 +1576,6 @@ class TestStockFlow(TestStockCommon): 'picking_id': picking_out.id, 'location_id': self.stock_location, 'location_dest_id': self.customer_location}) - # validate this delivery order, it should be in the waiting state picking_out.action_assign() self.assertEquals(picking_out.state, "confirmed") diff --git a/addons/stock/wizard/stock_backorder_confirmation.py b/addons/stock/wizard/stock_backorder_confirmation.py index 6261bf9b6eb..4dad7610dc1 100644 --- a/addons/stock/wizard/stock_backorder_confirmation.py +++ b/addons/stock/wizard/stock_backorder_confirmation.py @@ -19,11 +19,10 @@ class StockBackorderConfirmation(models.TransientModel): @api.one def _process(self, cancel_backorder=False): - for pack in self.pick_id.pack_operation_ids: - if pack.qty_done > 0: - pack.product_qty = pack.qty_done - else: - pack.unlink() + operations_to_delete = self.pick_id.pack_operation_ids.filtered(lambda o: o.qty_done <= 0) + for pack in self.pick_id.pack_operation_ids - operations_to_delete: + pack.product_qty = pack.qty_done + operations_to_delete.unlink() self.pick_id.do_transfer() if cancel_backorder: backorder_pick = self.env['stock.picking'].search([('backorder_id', '=', self.pick_id.id)]) diff --git a/addons/web_editor/models/ir_ui_view.py b/addons/web_editor/models/ir_ui_view.py index c50922bdce3..48a94e4b8cb 100644 --- a/addons/web_editor/models/ir_ui_view.py +++ b/addons/web_editor/models/ir_ui_view.py @@ -6,7 +6,7 @@ import logging from lxml import etree, html from odoo.exceptions import AccessError -from odoo import api, models +from odoo import api, fields, models _logger = logging.getLogger(__name__) @@ -33,6 +33,10 @@ class IrUiView(models.Model): def extract_embedded_fields(self, arch): return arch.xpath('//*[@data-oe-model != "ir.ui.view"]') + @api.model + def get_default_lang_code(self): + return False + @api.model def save_embedded_field(self, el): Model = self.env[el.get('data-oe-model')] @@ -44,7 +48,10 @@ class IrUiView(models.Model): if value is not None: # TODO: batch writes? - Model.browse(int(el.get('data-oe-id'))).write({field: value}) + if self.get_default_lang_code() and field != 'arch' and not isinstance(Model._fields[field], fields.Html): + Model.browse(int(el.get('data-oe-id'))).with_context(lang=self.get_default_lang_code()).write({field: value}) + else: + Model.browse(int(el.get('data-oe-id'))).write({field: value}) def _pretty_arch(self, arch): # remove_blank_string does not seem to work on HTMLParser, and diff --git a/addons/web_editor/static/src/js/backend.js b/addons/web_editor/static/src/js/backend.js index 1c6f069ae3c..7d22186c0a8 100644 --- a/addons/web_editor/static/src/js/backend.js +++ b/addons/web_editor/static/src/js/backend.js @@ -183,6 +183,11 @@ var FieldTextHtml = widget.extend({ template: 'web_editor.FieldTextHtml', willStart: function () { var self = this; + + if (this.field.translate === false) { + this.languages = []; + return $.when(); + } return new Model('res.lang').call("search_read", [[['code', '!=', 'en_US']], ["name", "code"]]).then(function (res) { self.languages = res; }); diff --git a/addons/website/models/ir_ui_view.py b/addons/website/models/ir_ui_view.py index 110ce7e39ee..3237b1f9c5b 100644 --- a/addons/website/models/ir_ui_view.py +++ b/addons/website/models/ir_ui_view.py @@ -146,3 +146,12 @@ class View(models.Model): if full: return views return views.filtered(lambda v: v.customize_show) + + @api.model + def get_default_lang_code(self): + website_id = self.env.context.get('website_id') + if website_id: + lang_code = self.env['website'].browse(website_id).default_lang_code + return lang_code + else: + return super(View, self).get_default_lang_code() diff --git a/addons/website_event_sale/tests/test_ui.py b/addons/website_event_sale/tests/test_ui.py index 193521db8d8..c2e6f04f4a6 100644 --- a/addons/website_event_sale/tests/test_ui.py +++ b/addons/website_event_sale/tests/test_ui.py @@ -7,6 +7,12 @@ class TestUi(odoo.tests.HttpCase): at_install = False def test_admin(self): + # Seen that: + # - this test relies on demo data that are entirely in USD (pricelists) + # - that main demo company is gelocated in US + # - that this test awaits for hardcoded USDs amount + # we have to force company currency as USDs only for this test + self.env.ref('base.main_company').write({'currency_id': self.env.ref('base.USD').id}) self.phantom_js("/", "odoo.__DEBUG__.services['web_tour.tour'].run('event_buy_tickets')", "odoo.__DEBUG__.services['web_tour.tour'].tours.event_buy_tickets.ready", login="admin") def test_demo(self): diff --git a/addons/website_portal_sale/controllers/main.py b/addons/website_portal_sale/controllers/main.py index 00d2e8377ac..06be481f7b2 100644 --- a/addons/website_portal_sale/controllers/main.py +++ b/addons/website_portal_sale/controllers/main.py @@ -172,7 +172,7 @@ class website_account(website_account): domain = [ ('type', 'in', ['out_invoice', 'out_refund']), ('message_partner_ids', 'child_of', [partner.commercial_partner_id.id]), - ('state', 'in', ['open', 'paid', 'cancelled']) + ('state', 'in', ['open', 'paid', 'cancel']) ] searchbar_sortings = { diff --git a/addons/website_quote/views/website_quote_templates.xml b/addons/website_quote/views/website_quote_templates.xml index 0ccd3162f02..4118da181f1 100644 --- a/addons/website_quote/views/website_quote_templates.xml +++ b/addons/website_quote/views/website_quote_templates.xml @@ -64,9 +64,9 @@ t-options='{"widget": "monetary", "display_currency": quotation.pricelist_id.currency_id}' t-att-style="line.discount and 'text-decoration: line-through' or None" t-att-class="(line.discount and 'text-danger' or '') + ' text-right'"/> -
- +
diff --git a/doc/_static/banners/m_1.jpg b/doc/_static/banners/m_1.jpg deleted file mode 100644 index ce4319631ba..00000000000 Binary files a/doc/_static/banners/m_1.jpg and /dev/null differ diff --git a/doc/_static/banners/m_2.jpg b/doc/_static/banners/m_2.jpg deleted file mode 100644 index dcc7232048e..00000000000 Binary files a/doc/_static/banners/m_2.jpg and /dev/null differ diff --git a/doc/_static/banners/m_accounting.jpg b/doc/_static/banners/m_accounting.jpg deleted file mode 100644 index e100460ba10..00000000000 Binary files a/doc/_static/banners/m_accounting.jpg and /dev/null differ diff --git a/doc/business.rst b/doc/business.rst deleted file mode 100644 index 4847aa345bf..00000000000 --- a/doc/business.rst +++ /dev/null @@ -1,9 +0,0 @@ -================== -Business Mementoes -================== - -.. toctree:: - - Accounting Memento (US GAAP) - Double-Entry Inventory - Inventory Valuations diff --git a/doc/cla/individual/wardm95.md b/doc/cla/individual/wardm95.md new file mode 100644 index 00000000000..765a1191a63 --- /dev/null +++ b/doc/cla/individual/wardm95.md @@ -0,0 +1,11 @@ +Belgium, 22/06/2017 + +I hereby agree to the terms of the Odoo Individual Contributor License +Agreement v1.0. + +I declare that I am authorized and able to make this agreement and sign this +declaration. + +Signed, + +Ward Marissen ward.marissen@gmail.com https://github.com/wardm95 diff --git a/doc/conf.py b/doc/conf.py index 5fb1c9101bc..ab71691afc7 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -94,11 +94,6 @@ pygments_style = 'odoo' html_theme = 'odoo_ext' odoo_cover_default = 'banners/installing_odoo.jpg' -odoo_cover_external = { - 'https://odoo.com/documentation/functional/accounting.html' : 'banners/m_accounting.jpg', - 'https://odoo.com/documentation/functional/double-entry.html' : 'banners/m_1.jpg', - 'https://odoo.com/documentation/functional/valuation.html' : 'banners/m_2.jpg', -} # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the diff --git a/doc/howtos/backend/exercise-wizard-launch b/doc/howtos/backend/exercise-wizard-launch index 605178e8375..d864eef3f87 100644 --- a/doc/howtos/backend/exercise-wizard-launch +++ b/doc/howtos/backend/exercise-wizard-launch @@ -17,7 +17,7 @@ Index: addons/openacademy/views/openacademy.xml =================================================================== --- addons.orig/openacademy/views/openacademy.xml 2014-08-28 14:34:07.879004780 +0200 +++ addons/openacademy/views/openacademy.xml 2014-08-28 14:34:07.871004780 +0200 -@@ -238,5 +238,26 @@ +@@ -237,5 +237,26 @@ diff --git a/doc/reference/cmdline.rst b/doc/reference/cmdline.rst index 73416366669..c92a8b034a9 100644 --- a/doc/reference/cmdline.rst +++ b/doc/reference/cmdline.rst @@ -2,9 +2,9 @@ .. _reference/cmdline: -=============================== +================================ Command-line interface: odoo-bin -=============================== +================================ .. _reference/cmdline/server: diff --git a/doc/reference/images/mobile_notification.png b/doc/reference/images/mobile_notification.png index 7fb37839af8..f2d189ee0fd 100644 Binary files a/doc/reference/images/mobile_notification.png and b/doc/reference/images/mobile_notification.png differ diff --git a/doc/reference/images/runner.png b/doc/reference/images/runner.png index 9991fce45a1..4cbba9416f3 100644 Binary files a/doc/reference/images/runner.png and b/doc/reference/images/runner.png differ diff --git a/doc/reference/images/runner2.png b/doc/reference/images/runner2.png index ff8f5bfe722..551141022a3 100644 Binary files a/doc/reference/images/runner2.png and b/doc/reference/images/runner2.png differ diff --git a/doc/reference/images/snackbar.png b/doc/reference/images/snackbar.png index 99e4dd42bbb..e3e204cb3dd 100644 Binary files a/doc/reference/images/snackbar.png and b/doc/reference/images/snackbar.png differ diff --git a/doc/reference/images/tests.png b/doc/reference/images/tests.png index bc3ce8b43fc..3b417889ee9 100644 Binary files a/doc/reference/images/tests.png and b/doc/reference/images/tests.png differ diff --git a/doc/reference/images/tests2.png b/doc/reference/images/tests2.png index 361fb7fb54b..075cd506bfb 100644 Binary files a/doc/reference/images/tests2.png and b/doc/reference/images/tests2.png differ diff --git a/doc/reference/images/tests3.png b/doc/reference/images/tests3.png index d323360497d..6901203b5ec 100644 Binary files a/doc/reference/images/tests3.png and b/doc/reference/images/tests3.png differ diff --git a/doc/reference/images/toast.png b/doc/reference/images/toast.png index 15a252d381d..03593885743 100644 Binary files a/doc/reference/images/toast.png and b/doc/reference/images/toast.png differ diff --git a/doc/reference/mobile.rst b/doc/reference/mobile.rst index 74bda5997ab..db9dc1343f4 100644 --- a/doc/reference/mobile.rst +++ b/doc/reference/mobile.rst @@ -10,11 +10,17 @@ Mobile JavaScript Introduction ============ -In Odoo 10.0 we released a mobile app, allows you to access all **Odoo apps** (even your customized modules). +In Odoo 10.0 we released a mobile app, allows you to access all **Odoo apps** +(even your customized modules). -The application is a combination of **Odoo Web** and **Native Mobile components**, in other words it is a Odoo Web instance loaded inside native WebView container of mobile. +The application is a combination of **Odoo Web** and **Native Mobile +components**, in other words it is a Odoo Web instance loaded inside native +WebView container of mobile. -This page documents how you can access mobile native components like Camera, Vibration, Notification, Toast through Odoo Web (via JavaScript). For this, you do not need to be a mobile developer, if you know Odoo JavaScript API you can access all available mobile features. +This page documents how you can access mobile native components like Camera, +Vibration, Notification, Toast through Odoo Web (via JavaScript). For this, you +do not need to be a mobile developer, if you know Odoo JavaScript API you can +access all available mobile features. .. warning:: This features works with **Odoo Enterprise 10.0+** only @@ -24,34 +30,41 @@ How does it work? Internal working of Mobile application: .. image:: images/mobile_working.jpg - :align: left -Of course, it is a web page that loads on a Mobile Native Web container. But it is integrated in such a way that you can access native resources from your web JavaScript. +Of course, it is a web page that loads on a Mobile Native Web container. But it +is integrated in such a way that you can access native resources from your web +JavaScript. -WebPages (Odoo Web) is on the top of each layer, where second layer is a Bridge between Odoo Web (JS) and Native component of mobile. +WebPages (Odoo Web) is on the top of each layer, where second layer is a Bridge +between Odoo Web (JS) and Native component of mobile. -When any call from JavaScript triggered it passes through Bridge and Bridge pass it to native invoker to perform that action. +When any call from JavaScript triggered it passes through Bridge and Bridge +pass it to native invoker to perform that action. -When the native component has done their work, it again is passed to Bridge and you get the output in JavaScript. +When the native component has done their work, it again is passed to Bridge and +you get the output in JavaScript. -Process time taken by the Native component depends on what you are requesting from Native resources. Like Camera or GPS Location. +Process time taken by the Native component depends on what you are requesting +from Native resources. Like Camera or GPS Location. How to use it? ============== -As Odoo Web Framework, Mobile api can be used anywhere by getting object of **web_mobile.rpc** +As Odoo Web Framework, Mobile api can be used anywhere by getting object of +**web_mobile.rpc** .. image:: images/odoo_mobile_api.png - :align: left -Mobile rpc object provide list of methods available (Works only with Mobile App). +Mobile rpc object provide list of methods available (Works only with Mobile +App). Just check for method availability and execute it. Methods ------- -.. note:: Each of the methods returns JQuery Deffered object with returning data JSON dictionary +.. note:: Each of the methods returns JQuery Deffered object with returning + data JSON dictionary Show Toast in device ..................... @@ -60,7 +73,9 @@ Show Toast in device :param object args: **message** text to display -A toast provides simple feedback about an operation in a small popup. It only fills the amount of space required for the message and the current activity remains visible and interactive +A toast provides simple feedback about an operation in a small popup. It only +fills the amount of space required for the message and the current activity +remains visible and interactive .. code-block:: javascript @@ -75,7 +90,8 @@ Vibrating device .. js:function:: vibrate - :param object args: Vibrates constantly for the specified period of time (in milliseconds). + :param object args: Vibrates constantly for the specified period of time + (in milliseconds). Vibrate mobile device with given duration. @@ -91,7 +107,10 @@ Show snackbar with action :param object args: (*required*) **Message** to show in snackbar and action **button label** in Snackbar (optional) :returns: ``True`` if User click on Action button, ``False`` if SnackBar auto dismissed after some time -Snackbars provide lightweight feedback about an operation. They show a brief message at the bottom of the screen on mobile and lower left on larger devices. Snackbars appear above all other elements on screen and only one can be displayed at a time. +Snackbars provide lightweight feedback about an operation. They show a brief +message at the bottom of the screen on mobile and lower left on larger devices. +Snackbars appear above all other elements on screen and only one can be +displayed at a time. .. code-block:: javascript @@ -112,7 +131,12 @@ Showing notification :param object args: **title** (first row) of the notification, **message** (second row) of the notification, in a standard notification. -A notification is a message you can display to the user outside of your application's normal UI. When you tell the system to issue a notification, it first appears as an icon in the notification area. To see the details of the notification, the user opens the notification drawer. Both the notification area and the notification drawer are system-controlled areas that the user can view at any time. +A notification is a message you can display to the user outside of your +application's normal UI. When you tell the system to issue a notification, it +first appears as an icon in the notification area. To see the details of the +notification, the user opens the notification drawer. Both the notification +area and the notification drawer are system-controlled areas that the user can +view at any time. .. code-block:: javascript diff --git a/doc/reference/orm.rst b/doc/reference/orm.rst index 78118d5d63f..876d74f65cc 100644 --- a/doc/reference/orm.rst +++ b/doc/reference/orm.rst @@ -910,13 +910,13 @@ and using them: .. literalinclude:: ../../odoo/addons/test_documentation_examples/tests/test_inheritance.py :language: python - :lines: 8,12,9,19 + :lines: 10,11,14,19 will yield: .. literalinclude:: ../../odoo/addons/test_documentation_examples/tests/test_inheritance.py :language: text - :lines: 15,22 + :lines: 16,21 the second model has inherited from the first model's ``check`` method and its ``name`` field, but overridden the ``call`` method, as when using standard @@ -964,19 +964,19 @@ model: .. literalinclude:: ../../odoo/addons/test_documentation_examples/tests/test_delegation.py :language: python - :lines: 9-12,21,26 + :lines: 11-14,23,28 will result in: .. literalinclude:: ../../odoo/addons/test_documentation_examples/tests/test_delegation.py :language: text - :lines: 23,28 + :lines: 25,30 and it's possible to write directly on the delegated field: .. literalinclude:: ../../odoo/addons/test_documentation_examples/tests/test_delegation.py :language: python - :lines: 47 + :lines: 45 .. warning:: when using delegation inheritance, methods are *not* inherited, only fields diff --git a/doc/reference/qweb.rst b/doc/reference/qweb.rst index f3e6a92e4b6..a806c3fda8f 100644 --- a/doc/reference/qweb.rst +++ b/doc/reference/qweb.rst @@ -415,14 +415,16 @@ At a deeper level than the previous helper is the ``render`` method on .. _reference/qweb/javascript: -API ---- +.. todo:: the members below are no longer relevant, section to rewrite -It is also possible to use the ``ir.qweb`` model directly (and extend it, and -inherit from it): +.. API +.. --- -.. automodule:: odoo.addons.base.ir.ir_qweb - :members: QWeb, QWebContext, FieldConverter, QwebWidget +.. It is also possible to use the ``ir.qweb`` model directly (and extend it, and +.. inherit from it): + +.. .. automodule:: odoo.addons.base.ir.ir_qweb +.. :members: QWeb, QWebContext, FieldConverter, QwebWidget Javascript ========== diff --git a/doc/reference/views.rst b/doc/reference/views.rst index 8d9b231b2b1..be37aaaa821 100644 --- a/doc/reference/views.rst +++ b/doc/reference/views.rst @@ -937,7 +937,7 @@ Javascript API :returns: an image URL .. warning:: - ``kanban_text_ellipsis`` has been removed in Odoo 9. CSS ``text-overflow`` should be used instead. + ``kanban_text_ellipsis`` has been removed in Odoo 9. CSS ``text-overflow`` should be used instead. .. _reference/views/calendar: diff --git a/odoo/addons/base/ir/ir_model.py b/odoo/addons/base/ir/ir_model.py index c940b09c497..24ee22f2d3e 100644 --- a/odoo/addons/base/ir/ir_model.py +++ b/odoo/addons/base/ir/ir_model.py @@ -676,7 +676,7 @@ class IrModelFields(models.Model): return attrs['comodel_name'] = field_data['relation'] attrs['ondelete'] = field_data['on_delete'] - attrs['domain'] = safe_eval(field_data['domain']) if field_data['domain'] else None + attrs['domain'] = safe_eval(field_data['domain'] or '[]') elif field_data['ttype'] == 'one2many': if partial and not ( field_data['relation'] in self.env and ( @@ -686,7 +686,7 @@ class IrModelFields(models.Model): return attrs['comodel_name'] = field_data['relation'] attrs['inverse_name'] = field_data['relation_field'] - attrs['domain'] = safe_eval(field_data['domain']) if field_data['domain'] else None + attrs['domain'] = safe_eval(field_data['domain'] or '[]') elif field_data['ttype'] == 'many2many': if partial and field_data['relation'] not in self.env: return @@ -695,7 +695,7 @@ class IrModelFields(models.Model): attrs['relation'] = field_data['relation_table'] or rel attrs['column1'] = field_data['column1'] or col1 attrs['column2'] = field_data['column2'] or col2 - attrs['domain'] = safe_eval(field_data['domain']) if field_data['domain'] else None + attrs['domain'] = safe_eval(field_data['domain'] or '[]') # add compute function if given if field_data['compute']: attrs['compute'] = make_compute(field_data['compute'], field_data['depends']) diff --git a/odoo/addons/base/ir/ir_translation.py b/odoo/addons/base/ir/ir_translation.py index 0d87f98f042..02bdd7015ba 100644 --- a/odoo/addons/base/ir/ir_translation.py +++ b/odoo/addons/base/ir/ir_translation.py @@ -47,7 +47,8 @@ class IrTranslationImport(object): # of ir_translation, so this copy will be much faster. query = """ CREATE TEMP TABLE %s ( imd_model VARCHAR(64), - imd_name VARCHAR(128) + imd_name VARCHAR(128), + noupdate BOOLEAN ) INHERITS (%s) """ % (self._table, self._model_table) self._cr.execute(query) @@ -104,7 +105,8 @@ class IrTranslationImport(object): # Step 1: resolve ir.model.data references to res_ids cr.execute(""" UPDATE %s AS ti - SET res_id = imd.res_id + SET res_id = imd.res_id, + noupdate = imd.noupdate FROM ir_model_data AS imd WHERE ti.res_id IS NULL AND ti.module IS NOT NULL AND ti.imd_name IS NOT NULL @@ -150,7 +152,10 @@ class IrTranslationImport(object): src = ti.src, state = 'translated' FROM %s AS ti - WHERE %s AND ti.value IS NOT NULL AND ti.value != '' + WHERE %s + AND ti.value IS NOT NULL + AND ti.value != '' + AND noupdate IS NOT TRUE """ % (self._model_table, self._table, find_expr), (tuple(src_relevant_fields), tuple(src_relevant_fields))) diff --git a/odoo/addons/base/ir/ir_ui_view.py b/odoo/addons/base/ir/ir_ui_view.py index d2832c6580d..e31057e2218 100644 --- a/odoo/addons/base/ir/ir_ui_view.py +++ b/odoo/addons/base/ir/ir_ui_view.py @@ -373,6 +373,8 @@ actual arch. else: try: + if not values.get('arch') and not values.get('arch_base'): + raise ValidationError(_('Missing view architecture.')) values['type'] = etree.fromstring(values.get('arch') or values.get('arch_base')).tag except LxmlError: # don't raise here, the constraint that runs `self._check_xml` will diff --git a/odoo/addons/base/res/res_users.py b/odoo/addons/base/res/res_users.py index da025eeca78..5621b99ee04 100644 --- a/odoo/addons/base/res/res_users.py +++ b/odoo/addons/base/res/res_users.py @@ -270,10 +270,6 @@ class Users(models.Model): if self.login and tools.single_email_re.match(self.login): self.email = self.login - @api.onchange('state_id') - def onchange_state(self): - return self.mapped('partner_id').onchange_state() - @api.onchange('parent_id') def onchange_parent_id(self): return self.mapped('partner_id').onchange_parent_id() diff --git a/odoo/addons/test_documentation_examples/tests/test_delegation.py b/odoo/addons/test_documentation_examples/tests/test_delegation.py index 90279f24208..327485e63ea 100644 --- a/odoo/addons/test_documentation_examples/tests/test_delegation.py +++ b/odoo/addons/test_documentation_examples/tests/test_delegation.py @@ -19,8 +19,16 @@ class TestDelegation(common.TransactionCase): record = self.record # children fields can be looked up on the parent record directly - self.assertEqual(record.field_0, 0) - self.assertEqual(record.field_1, 1) + self.assertEqual( + record.field_0 + , + 0 + ) + self.assertEqual( + record.field_1 + , + 1 + ) def test_swap_child(self): env = self.env diff --git a/odoo/addons/test_documentation_examples/tests/test_inheritance.py b/odoo/addons/test_documentation_examples/tests/test_inheritance.py index 699c6b98ed2..38a1ae5747b 100644 --- a/odoo/addons/test_documentation_examples/tests/test_inheritance.py +++ b/odoo/addons/test_documentation_examples/tests/test_inheritance.py @@ -10,5 +10,13 @@ class TestBasicInheritance(common.TransactionCase): a = env['inheritance.0'].create({'name': 'A'}) b = env['inheritance.1'].create({'name': 'B'}) - self.assertEqual(a.call(), "This is model 0 record A") - self.assertEqual(b.call(), "This is model 1 record B") + self.assertEqual( + a.call() + , + "This is model 0 record A" + ) + self.assertEqual( + b.call() + , + "This is model 1 record B" + ) diff --git a/odoo/tests/addons/test_translation_import/tests/test_term_count.py b/odoo/tests/addons/test_translation_import/tests/test_term_count.py index d63f2b01baa..864c4222962 100644 --- a/odoo/tests/addons/test_translation_import/tests/test_term_count.py +++ b/odoo/tests/addons/test_translation_import/tests/test_term_count.py @@ -13,3 +13,20 @@ class TestTermCount(common.TransactionCase): ids = self.env['ir.translation'].search( [('src', '=', '1XBUO5PUYH2RYZSA1FTLRYS8SPCNU1UYXMEYMM25ASV7JC2KTJZQESZYRV9L8CGB')]) self.assertEqual(len(ids), 2) + + def test_noupdate(self): + """ + Make sure no update do not overwrite translations + """ + menu = self.env.ref('test_translation_import.menu_test_translation_import') + menu.name = "New Name" + # install french and change translation content + odoo.tools.trans_load(self.cr, 'test_translation_import/i18n/fr.po', 'fr_FR', verbose=False) + menu.with_context(lang='fr_FR').name = "Nouveau nom" + # reload with overwrite + odoo.tools.trans_load(self.cr, 'test_translation_import/i18n/fr.po', 'fr_FR', verbose=False, context={'overwrite': True}) + + # trans_load invalidates ormcache but not record cache + menu.refresh() + self.assertEqual(menu.name, "New Name") + self.assertEqual(menu.with_context(lang='fr_FR').name, "Nouveau nom") diff --git a/odoo/tests/addons/test_translation_import/view.xml b/odoo/tests/addons/test_translation_import/view.xml index 7dd417707e3..c4e31d6cebd 100644 --- a/odoo/tests/addons/test_translation_import/view.xml +++ b/odoo/tests/addons/test_translation_import/view.xml @@ -1,6 +1,6 @@ - + Test translation import diff --git a/requirements.txt b/requirements.txt index 9109a29a8c7..e4946010ae3 100644 --- a/requirements.txt +++ b/requirements.txt @@ -17,7 +17,7 @@ passlib==1.6.5 Pillow==3.4.1 psutil==4.3.1 psycogreen==1.0 -psycopg2==2.6.2 +psycopg2==2.7.1 pydot==1.2.3 pyparsing==2.1.10 pyPdf==1.13