[MERGE] forward port branch saas-11.2 up to 3376bad191

This commit is contained in:
Christophe Simonis
2018-07-30 15:51:38 +02:00
37 changed files with 26411 additions and 23774 deletions
+2
View File
@@ -1266,6 +1266,8 @@ class AccountInvoice(models.Model):
values[name] = line[name] values[name] = line[name]
elif name == 'invoice_line_tax_ids': elif name == 'invoice_line_tax_ids':
values[name] = [(6, 0, line[name].ids)] values[name] = [(6, 0, line[name].ids)]
elif name == 'analytic_tag_ids':
values[name] = [(6, 0, line[name].ids)]
result.append((0, 0, values)) result.append((0, 0, values))
return result return result
@@ -326,7 +326,6 @@
<td style="padding:25px 0px;"> <td style="padding:25px 0px;">
<strong>Add this event to your calendar</strong> <strong>Add this event to your calendar</strong>
<a href="https://www.google.com/calendar/render?action=TEMPLATE&text=${object.event_id.name}&dates=${date_begin}/${date_end}&location=${location}" style="padding:3px 5px;border:1px solid #875A7B;color:#875A7B;text-decoration:none;border-radius:3px;" target="new"><img src="/web_editor/font_to_img/61525/rgb(135,90,123)/16" style="vertical-align:middle;" height="16"> Google</a> <a href="https://www.google.com/calendar/render?action=TEMPLATE&text=${object.event_id.name}&dates=${date_begin}/${date_end}&location=${location}" style="padding:3px 5px;border:1px solid #875A7B;color:#875A7B;text-decoration:none;border-radius:3px;" target="new"><img src="/web_editor/font_to_img/61525/rgb(135,90,123)/16" style="vertical-align:middle;" height="16"> Google</a>
<a href="https://bay02.calendar.live.com/calendar/calendar.aspx?rru=addevent&summary=${object.event_id.name}&dtstart=${date_begin}&dtend=${date_end}&location=${location}" style="padding:3px 5px;border:1px solid #875A7B;color:#875A7B;text-decoration:none;border-radius:3px;" target="new"><img src="/web_editor/font_to_img/61525/rgb(135,90,123)/16" style="vertical-align:middle;" height="16"> Outlook</a>
<a href="https://calendar.yahoo.com/?v=60&view=d&type=20&title=${object.event_id.name}&in_loc=${location}&st=${format_tz(object.event_id.date_begin, tz='UTC', format='%Y%m%dT%H%M%S')}&et=${format_tz(object.event_id.date_end, tz='UTC', format='%Y%m%dT%H%M%S')}" style="padding:3px 5px;border:1px solid #875A7B;color:#875A7B;text-decoration:none;border-radius:3px;" target="new"><img src="/web_editor/font_to_img/61525/rgb(135,90,123)/16" style="vertical-align:middle;" height="16"> Yahoo</a> <a href="https://calendar.yahoo.com/?v=60&view=d&type=20&title=${object.event_id.name}&in_loc=${location}&st=${format_tz(object.event_id.date_begin, tz='UTC', format='%Y%m%dT%H%M%S')}&et=${format_tz(object.event_id.date_end, tz='UTC', format='%Y%m%dT%H%M%S')}" style="padding:3px 5px;border:1px solid #875A7B;color:#875A7B;text-decoration:none;border-radius:3px;" target="new"><img src="/web_editor/font_to_img/61525/rgb(135,90,123)/16" style="vertical-align:middle;" height="16"> Yahoo</a>
</td> </td>
</tr> </tr>
+11
View File
@@ -459,6 +459,17 @@ class EventRegistration(models.Model):
pass pass
return recipients return recipients
@api.multi
def message_get_default_recipients(self):
# Prioritize registration email over partner_id, which may be shared when a single
# partner booked multiple seats
return {
r.id: {'partner_ids': [],
'email_to': r.email,
'email_cc': False}
for r in self
}
def _message_post_after_hook(self, message, values, notif_layout, notif_values): def _message_post_after_hook(self, message, values, notif_layout, notif_values):
if self.email and not self.partner_id: if self.email and not self.partner_id:
# we consider that posting a message with a specified recipient (not a follower, a specific one) # we consider that posting a message with a specified recipient (not a follower, a specific one)
@@ -44,7 +44,7 @@
<t t-if="l.task_id"><span t-field="l.task_id.name"/></t> <t t-if="l.task_id"><span t-field="l.task_id.name"/></t>
</td> </td>
<td class="text-right"> <td class="text-right">
<span t-esc="'%s:%02.0f' % tuple(int(round(x)) for x in divmod(l.unit_amount*60,60))"/> <span t-field="l.unit_amount" t-options="{'widget': 'float_time'}"/>
</td> </td>
</tr> </tr>
</t> </t>
@@ -53,7 +53,9 @@
<td /> <td />
<td t-if="show_task"/> <td t-if="show_task"/>
<td class="text-right"><strong>Total</strong></td> <td class="text-right"><strong>Total</strong></td>
<td class="text-right"><strong t-esc="'%s:%02.0f' % tuple(int(round(x)) for x in divmod(sum(docs.mapped('unit_amount'))*60,60))"/></td> <t t-set="total_value" t-value="sum(docs.mapped('unit_amount'))" />
<t t-set="sign" t-value="'-' if total_value &lt; 0 else ''"/>
<td class="text-right"><strong t-esc="sign + '%s:%02.0f' % tuple(int(round(x)) for x in divmod(abs(total_value)*60,60))"/></td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
+118 -118
View File
@@ -3,183 +3,183 @@
<!-- Account Tax Tags --> <!-- Account Tax Tags -->
<record id="tag_de_41" model="account.account.tag"> <record id="tag_de_41" model="account.account.tag">
<field name="name">Umsatzsteuer-Voranmeldung Code 41</field> <field name="name">Ust-VA KZ 41</field>
<field name="applicability">taxes</field> <field name="applicability">taxes</field>
</record> </record>
<record id="tag_de_44" model="account.account.tag"> <record id="tag_de_44" model="account.account.tag">
<field name="name">Umsatzsteuer-Voranmeldung Code 44</field> <field name="name">Ust-VA KZ 44</field>
<field name="applicability">taxes</field> <field name="applicability">taxes</field>
</record> </record>
<record id="tag_de_49" model="account.account.tag"> <record id="tag_de_49" model="account.account.tag">
<field name="name">Umsatzsteuer-Voranmeldung Code 49</field> <field name="name">Ust-VA KZ 49</field>
<field name="applicability">taxes</field> <field name="applicability">taxes</field>
</record> </record>
<record id="tag_de_43" model="account.account.tag"> <record id="tag_de_43" model="account.account.tag">
<field name="name">Umsatzsteuer-Voranmeldung Code 43</field> <field name="name">Ust-VA KZ 43</field>
<field name="applicability">taxes</field> <field name="applicability">taxes</field>
</record> </record>
<record id="tag_de_48" model="account.account.tag"> <record id="tag_de_48" model="account.account.tag">
<field name="name">Umsatzsteuer-Voranmeldung Code 48</field> <field name="name">Ust-VA KZ 48</field>
<field name="applicability">taxes</field> <field name="applicability">taxes</field>
</record> </record>
<record id="tag_de_81" model="account.account.tag"> <record id="tag_de_81" model="account.account.tag">
<field name="name">Umsatzsteuer-Voranmeldung Code 81</field> <field name="name">Ust-VA KZ 81</field>
<field name="applicability">taxes</field> <field name="applicability">taxes</field>
</record> </record>
<record id="tag_de_86" model="account.account.tag"> <record id="tag_de_86" model="account.account.tag">
<field name="name">Umsatzsteuer-Voranmeldung Code 86</field> <field name="name">Ust-VA KZ 86</field>
<field name="applicability">taxes</field> <field name="applicability">taxes</field>
</record> </record>
<record id="tag_de_35" model="account.account.tag"> <record id="tag_de_35" model="account.account.tag">
<field name="name">Umsatzsteuer-Voranmeldung Code 35</field> <field name="name">Ust-VA KZ 35</field>
<field name="applicability">taxes</field> <field name="applicability">taxes</field>
</record> </record>
<record id="tag_de_77" model="account.account.tag"> <record id="tag_de_77" model="account.account.tag">
<field name="name">Umsatzsteuer-Voranmeldung Code 77</field> <field name="name">Ust-VA KZ 77</field>
<field name="applicability">taxes</field> <field name="applicability">taxes</field>
</record> </record>
<record id="tag_de_76" model="account.account.tag"> <record id="tag_de_76" model="account.account.tag">
<field name="name">Umsatzsteuer-Voranmeldung Code 76</field> <field name="name">Ust-VA KZ 76</field>
<field name="applicability">taxes</field> <field name="applicability">taxes</field>
</record> </record>
<record id="tag_de_91" model="account.account.tag"> <record id="tag_de_91" model="account.account.tag">
<field name="name">Umsatzsteuer-Voranmeldung Code 91</field> <field name="name">Ust-VA KZ 91</field>
<field name="applicability">taxes</field> <field name="applicability">taxes</field>
</record> </record>
<record id="tag_de_89" model="account.account.tag"> <record id="tag_de_89" model="account.account.tag">
<field name="name">Umsatzsteuer-Voranmeldung Code 89</field> <field name="name">Ust-VA KZ 89</field>
<field name="applicability">taxes</field> <field name="applicability">taxes</field>
</record> </record>
<record id="tag_de_93" model="account.account.tag"> <record id="tag_de_93" model="account.account.tag">
<field name="name">Umsatzsteuer-Voranmeldung Code 93</field> <field name="name">Ust-VA KZ 93</field>
<field name="applicability">taxes</field> <field name="applicability">taxes</field>
</record> </record>
<record id="tag_de_95" model="account.account.tag"> <record id="tag_de_95" model="account.account.tag">
<field name="name">Umsatzsteuer-Voranmeldung Code 95</field> <field name="name">Ust-VA KZ 95</field>
<field name="applicability">taxes</field> <field name="applicability">taxes</field>
</record> </record>
<record id="tag_de_94" model="account.account.tag"> <record id="tag_de_94" model="account.account.tag">
<field name="name">Umsatzsteuer-Voranmeldung Code 94</field> <field name="name">Ust-VA KZ 94</field>
<field name="applicability">taxes</field> <field name="applicability">taxes</field>
</record> </record>
<record id="tag_de_42" model="account.account.tag"> <record id="tag_de_42" model="account.account.tag">
<field name="name">Umsatzsteuer-Voranmeldung Code 42</field> <field name="name">Ust-VA KZ 42</field>
<field name="applicability">taxes</field> <field name="applicability">taxes</field>
</record> </record>
<record id="tag_de_68" model="account.account.tag"> <record id="tag_de_68" model="account.account.tag">
<field name="name">Umsatzsteuer-Voranmeldung Code 68</field> <field name="name">Ust-VA KZ 68</field>
<field name="applicability">taxes</field> <field name="applicability">taxes</field>
</record> </record>
<record id="tag_de_60" model="account.account.tag"> <record id="tag_de_60" model="account.account.tag">
<field name="name">Umsatzsteuer-Voranmeldung Code 60</field> <field name="name">Ust-VA KZ 60</field>
<field name="applicability">taxes</field> <field name="applicability">taxes</field>
</record> </record>
<record id="tag_de_21" model="account.account.tag"> <record id="tag_de_21" model="account.account.tag">
<field name="name">Umsatzsteuer-Voranmeldung Code 21</field> <field name="name">Ust-VA KZ 21</field>
<field name="applicability">taxes</field> <field name="applicability">taxes</field>
</record> </record>
<record id="tag_de_45" model="account.account.tag"> <record id="tag_de_45" model="account.account.tag">
<field name="name">Umsatzsteuer-Voranmeldung Code 45</field> <field name="name">Ust-VA KZ 45</field>
<field name="applicability">taxes</field> <field name="applicability">taxes</field>
</record> </record>
<record id="tag_de_46" model="account.account.tag"> <record id="tag_de_46" model="account.account.tag">
<field name="name">Umsatzsteuer-Voranmeldung Code 46</field> <field name="name">Ust-VA KZ 46</field>
<field name="applicability">taxes</field> <field name="applicability">taxes</field>
</record> </record>
<record id="tag_de_52" model="account.account.tag"> <record id="tag_de_52" model="account.account.tag">
<field name="name">Umsatzsteuer-Voranmeldung Code 52</field> <field name="name">Ust-VA KZ 52</field>
<field name="applicability">taxes</field> <field name="applicability">taxes</field>
</record> </record>
<record id="tag_de_73" model="account.account.tag"> <record id="tag_de_73" model="account.account.tag">
<field name="name">Umsatzsteuer-Voranmeldung Code 73</field> <field name="name">Ust-VA KZ 73</field>
<field name="applicability">taxes</field> <field name="applicability">taxes</field>
</record> </record>
<record id="tag_de_78" model="account.account.tag"> <record id="tag_de_78" model="account.account.tag">
<field name="name">Umsatzsteuer-Voranmeldung Code 78</field> <field name="name">Ust-VA KZ 78</field>
<field name="applicability">taxes</field> <field name="applicability">taxes</field>
</record> </record>
<record id="tag_de_84" model="account.account.tag"> <record id="tag_de_84" model="account.account.tag">
<field name="name">Umsatzsteuer-Voranmeldung Code 84</field> <field name="name">Ust-VA KZ 84</field>
<field name="applicability">taxes</field> <field name="applicability">taxes</field>
</record> </record>
<record id="tag_de_36" model="account.account.tag"> <record id="tag_de_36" model="account.account.tag">
<field name="name">Umsatzsteuer-Voranmeldung Code 36</field> <field name="name">Ust-VA KZ 36</field>
<field name="applicability">taxes</field> <field name="applicability">taxes</field>
</record> </record>
<record id="tag_de_80" model="account.account.tag"> <record id="tag_de_80" model="account.account.tag">
<field name="name">Umsatzsteuer-Voranmeldung Code 80</field> <field name="name">Ust-VA KZ 80</field>
<field name="applicability">taxes</field> <field name="applicability">taxes</field>
</record> </record>
<record id="tag_de_98" model="account.account.tag"> <record id="tag_de_98" model="account.account.tag">
<field name="name">Umsatzsteuer-Voranmeldung Code 98</field> <field name="name">Ust-VA KZ 98</field>
<field name="applicability">taxes</field> <field name="applicability">taxes</field>
</record> </record>
<record id="tag_de_96" model="account.account.tag"> <record id="tag_de_96" model="account.account.tag">
<field name="name">Umsatzsteuer-Voranmeldung Code 96</field> <field name="name">Ust-VA KZ 96</field>
<field name="applicability">taxes</field> <field name="applicability">taxes</field>
</record> </record>
<record id="tag_de_47" model="account.account.tag"> <record id="tag_de_47" model="account.account.tag">
<field name="name">Umsatzsteuer-Voranmeldung Code 47</field> <field name="name">Ust-VA KZ 47</field>
<field name="applicability">taxes</field> <field name="applicability">taxes</field>
</record> </record>
<record id="tag_de_53" model="account.account.tag"> <record id="tag_de_53" model="account.account.tag">
<field name="name">Umsatzsteuer-Voranmeldung Code 53</field> <field name="name">Ust-VA KZ 53</field>
<field name="applicability">taxes</field> <field name="applicability">taxes</field>
</record> </record>
<record id="tag_de_74" model="account.account.tag"> <record id="tag_de_74" model="account.account.tag">
<field name="name">Umsatzsteuer-Voranmeldung Code 74</field> <field name="name">Ust-VA KZ 74</field>
<field name="applicability">taxes</field> <field name="applicability">taxes</field>
</record> </record>
<record id="tag_de_79" model="account.account.tag"> <record id="tag_de_79" model="account.account.tag">
<field name="name">Umsatzsteuer-Voranmeldung Code 79</field> <field name="name">Ust-VA KZ 79</field>
<field name="applicability">taxes</field> <field name="applicability">taxes</field>
</record> </record>
<record id="tag_de_85" model="account.account.tag"> <record id="tag_de_85" model="account.account.tag">
<field name="name">Umsatzsteuer-Voranmeldung Code 85</field> <field name="name">Ust-VA KZ 85</field>
<field name="applicability">taxes</field> <field name="applicability">taxes</field>
</record> </record>
<record id="tag_de_65" model="account.account.tag"> <record id="tag_de_65" model="account.account.tag">
<field name="name">Umsatzsteuer-Voranmeldung Code 65</field> <field name="name">Ust-VA KZ 65</field>
<field name="applicability">taxes</field> <field name="applicability">taxes</field>
</record> </record>
<record id="tag_de_66" model="account.account.tag"> <record id="tag_de_66" model="account.account.tag">
<field name="name">Umsatzsteuer-Voranmeldung Code 66</field> <field name="name">Ust-VA KZ 66</field>
<field name="applicability">taxes</field> <field name="applicability">taxes</field>
</record> </record>
<record id="tag_de_61" model="account.account.tag"> <record id="tag_de_61" model="account.account.tag">
<field name="name">Umsatzsteuer-Voranmeldung Code 61</field> <field name="name">Ust-VA KZ 61</field>
<field name="applicability">taxes</field> <field name="applicability">taxes</field>
</record> </record>
<record id="tag_de_62" model="account.account.tag"> <record id="tag_de_62" model="account.account.tag">
<field name="name">Umsatzsteuer-Voranmeldung Code 62</field> <field name="name">Ust-VA KZ 62</field>
<field name="applicability">taxes</field> <field name="applicability">taxes</field>
</record> </record>
<record id="tag_de_67" model="account.account.tag"> <record id="tag_de_67" model="account.account.tag">
<field name="name">Umsatzsteuer-Voranmeldung Code 67</field> <field name="name">Ust-VA KZ 67</field>
<field name="applicability">taxes</field> <field name="applicability">taxes</field>
</record> </record>
<record id="tag_de_63" model="account.account.tag"> <record id="tag_de_63" model="account.account.tag">
<field name="name">Umsatzsteuer-Voranmeldung Code 63</field> <field name="name">Ust-VA KZ 63</field>
<field name="applicability">taxes</field> <field name="applicability">taxes</field>
</record> </record>
<record id="tag_de_64" model="account.account.tag"> <record id="tag_de_64" model="account.account.tag">
<field name="name">Umsatzsteuer-Voranmeldung Code 64</field> <field name="name">Ust-VA KZ 64</field>
<field name="applicability">taxes</field> <field name="applicability">taxes</field>
</record> </record>
<record id="tag_de_59" model="account.account.tag"> <record id="tag_de_59" model="account.account.tag">
<field name="name">Umsatzsteuer-Voranmeldung Code 59</field> <field name="name">Ust-VA KZ 59</field>
<field name="applicability">taxes</field> <field name="applicability">taxes</field>
</record> </record>
<record id="tag_de_69" model="account.account.tag"> <record id="tag_de_69" model="account.account.tag">
<field name="name">Umsatzsteuer-Voranmeldung Code 69</field> <field name="name">Ust-VA KZ 69</field>
<field name="applicability">taxes</field> <field name="applicability">taxes</field>
</record> </record>
<record id="tag_de_39" model="account.account.tag"> <record id="tag_de_39" model="account.account.tag">
<field name="name">Umsatzsteuer-Voranmeldung Code 39</field> <field name="name">Ust-VA KZ 39</field>
<field name="applicability">taxes</field> <field name="applicability">taxes</field>
</record> </record>
<record id="tag_de_83" model="account.account.tag"> <record id="tag_de_83" model="account.account.tag">
<field name="name">Umsatzsteuer-Voranmeldung Code 83</field> <field name="name">Ust-VA KZ 83</field>
<field name="applicability">taxes</field> <field name="applicability">taxes</field>
</record> </record>
@@ -188,300 +188,300 @@
<field name="applicability">taxes</field> <field name="applicability">taxes</field>
</record> </record>
<record id="tag_de_intracom_community_supplies" model="account.account.tag"> <record id="tag_de_intracom_community_supplies" model="account.account.tag">
<field name="name">Sonstige leistungen</field> <field name="name">Sonstige Leistungen</field>
<field name="applicability">taxes</field> <field name="applicability">taxes</field>
</record> </record>
<record id="tag_de_intracom_ABC" model="account.account.tag"> <record id="tag_de_intracom_ABC" model="account.account.tag">
<field name="name">Dreiecksgecshäfte</field> <field name="name">Dreiecksgeschäfte</field>
<field name="applicability">taxes</field> <field name="applicability">taxes</field>
</record> </record>
<!-- Profit and loss tags --> <!-- Profit and loss tags -->
<record id="tag_de_pl_01" model="account.account.tag"> <record id="tag_de_pl_01" model="account.account.tag">
<field name="name">P&amp;L: 1-Umsatzerlöse</field> <field name="name">G&amp;V: 1-Umsatzerlöse</field>
<field name="applicability">accounts</field> <field name="applicability">accounts</field>
</record> </record>
<record id="tag_de_pl_02" model="account.account.tag"> <record id="tag_de_pl_02" model="account.account.tag">
<field name="name">P&amp;L: 2-Erhöhung oder Verminderung des Bestands an fertigen und unfertigen Erzeugnissen</field> <field name="name">G&amp;V: 2-Erhöhung oder Verminderung des Bestands an fertigen und unfertigen Erzeugnissen</field>
<field name="applicability">accounts</field> <field name="applicability">accounts</field>
</record> </record>
<record id="tag_de_pl_03" model="account.account.tag"> <record id="tag_de_pl_03" model="account.account.tag">
<field name="name">P&amp;L: 3-Andere aktivierte eigenleistungen</field> <field name="name">G&amp;V: 3-Andere aktivierte Eigenleistungen</field>
<field name="applicability">accounts</field> <field name="applicability">accounts</field>
</record> </record>
<record id="tag_de_pl_04" model="account.account.tag"> <record id="tag_de_pl_04" model="account.account.tag">
<field name="name">P&amp;L: 4-Sonstige betrieliche erträge</field> <field name="name">G&amp;V: 4-Sonstige betrieliche Erträge</field>
<field name="applicability">accounts</field> <field name="applicability">accounts</field>
</record> </record>
<record id="tag_de_pl_05" model="account.account.tag"> <record id="tag_de_pl_05" model="account.account.tag">
<field name="name">P&amp;L: 5-Materialaufwand</field> <field name="name">G&amp;V: 5-Materialaufwand</field>
<field name="applicability">accounts</field> <field name="applicability">accounts</field>
</record> </record>
<record id="tag_de_pl_06" model="account.account.tag"> <record id="tag_de_pl_06" model="account.account.tag">
<field name="name">P&amp;L: 6-Personalaufwand</field> <field name="name">G&amp;V: 6-Personalaufwand</field>
<field name="applicability">accounts</field> <field name="applicability">accounts</field>
</record> </record>
<record id="tag_de_pl_07" model="account.account.tag"> <record id="tag_de_pl_07" model="account.account.tag">
<field name="name">P&amp;L: 7-Abschreibungen</field> <field name="name">G&amp;V: 7-Abschreibungen</field>
<field name="applicability">accounts</field> <field name="applicability">accounts</field>
</record> </record>
<record id="tag_de_pl_08_1" model="account.account.tag"> <record id="tag_de_pl_08_1" model="account.account.tag">
<field name="name">P&amp;L: 8.1-Raumkosten</field> <field name="name">G&amp;V: 8.1-Raumkosten</field>
<field name="applicability">accounts</field> <field name="applicability">accounts</field>
</record> </record>
<record id="tag_de_pl_08_2" model="account.account.tag"> <record id="tag_de_pl_08_2" model="account.account.tag">
<field name="name">P&amp;L: 8.2-Versicherungen, Beiträge und Abgaben</field> <field name="name">G&amp;V: 8.2-Versicherungen, Beiträge und Abgaben</field>
<field name="applicability">accounts</field> <field name="applicability">accounts</field>
</record> </record>
<record id="tag_de_pl_08_3" model="account.account.tag"> <record id="tag_de_pl_08_3" model="account.account.tag">
<field name="name">P&amp;L: 8.3-eparaturen und Instandhaltungen</field> <field name="name">G&amp;V: 8.3-Reparaturen und Instandhaltungen</field>
<field name="applicability">accounts</field> <field name="applicability">accounts</field>
</record> </record>
<record id="tag_de_pl_08_4" model="account.account.tag"> <record id="tag_de_pl_08_4" model="account.account.tag">
<field name="name">P&amp;L: 8.4-Fahrzeugkosten</field> <field name="name">G&amp;V: 8.4-Fahrzeugkosten</field>
<field name="applicability">accounts</field> <field name="applicability">accounts</field>
</record> </record>
<record id="tag_de_pl_08_5" model="account.account.tag"> <record id="tag_de_pl_08_5" model="account.account.tag">
<field name="name">P&amp;L: 8.5-Werbe- und Reisekosten</field> <field name="name">G&amp;V: 8.5-Werbe- und Reisekosten</field>
<field name="applicability">accounts</field> <field name="applicability">accounts</field>
</record> </record>
<record id="tag_de_pl_08_6" model="account.account.tag"> <record id="tag_de_pl_08_6" model="account.account.tag">
<field name="name">P&amp;L: 8.6-Kosten der Warenabgabe</field> <field name="name">G&amp;V: 8.6-Kosten der Warenabgabe</field>
<field name="applicability">accounts</field> <field name="applicability">accounts</field>
</record> </record>
<record id="tag_de_pl_08_7" model="account.account.tag"> <record id="tag_de_pl_08_7" model="account.account.tag">
<field name="name">P&amp;L: 8.7-verschiedene betriebliche Kosten</field> <field name="name">G&amp;V: 8.7-verschiedene betriebliche Kosten</field>
<field name="applicability">accounts</field> <field name="applicability">accounts</field>
</record> </record>
<record id="tag_de_pl_09" model="account.account.tag"> <record id="tag_de_pl_09" model="account.account.tag">
<field name="name">P&amp;L: 9-Erträge aus beteiligungen</field> <field name="name">G&amp;V: 9-Erträge aus Beteiligungen</field>
<field name="applicability">accounts</field> <field name="applicability">accounts</field>
</record> </record>
<record id="tag_de_pl_10" model="account.account.tag"> <record id="tag_de_pl_10" model="account.account.tag">
<field name="name">P&amp;L: 10-Erträge aus anderen wertpapieren und ausleihungen des finanzanlagevermögens</field> <field name="name">G&amp;V: 10-Erträge aus anderen Wertpapieren und Ausleihungen des Finanzanlagevermögens</field>
<field name="applicability">accounts</field> <field name="applicability">accounts</field>
</record> </record>
<record id="tag_de_pl_11" model="account.account.tag"> <record id="tag_de_pl_11" model="account.account.tag">
<field name="name">P&amp;L: 11-Sonstige zinsen und ähnliche erträge</field> <field name="name">G&amp;V: 11-Sonstige Zinsen und ähnliche Erträge</field>
<field name="applicability">accounts</field> <field name="applicability">accounts</field>
</record> </record>
<record id="tag_de_pl_12" model="account.account.tag"> <record id="tag_de_pl_12" model="account.account.tag">
<field name="name">P&amp;L: 12-Abschreibungen auf Finanzanlagen und auf Wertpapiere des Umlaufvermögens</field> <field name="name">G&amp;V: 12-Abschreibungen auf Finanzanlagen und auf Wertpapiere des Umlaufvermögens</field>
<field name="applicability">accounts</field> <field name="applicability">accounts</field>
</record> </record>
<record id="tag_de_pl_13" model="account.account.tag"> <record id="tag_de_pl_13" model="account.account.tag">
<field name="name">P&amp;L: 13-Zinsen und ähnliche Aufwendungen</field> <field name="name">G&amp;V: 13-Zinsen und ähnliche Aufwendungen</field>
<field name="applicability">accounts</field> <field name="applicability">accounts</field>
</record> </record>
<record id="tag_de_pl_14" model="account.account.tag"> <record id="tag_de_pl_14" model="account.account.tag">
<field name="name">P&amp;L: 14-Steuern vom einkommen und ertrag</field> <field name="name">G&amp;V: 14-Steuern vom Einkommen und Ertrag</field>
<field name="applicability">accounts</field> <field name="applicability">accounts</field>
</record> </record>
<record id="tag_de_pl_15" model="account.account.tag"> <record id="tag_de_pl_15" model="account.account.tag">
<field name="name">P&amp;L: 15-Sonstige steuern</field> <field name="name">G&amp;V: 15-Sonstige Steuern</field>
<field name="applicability">accounts</field> <field name="applicability">accounts</field>
</record> </record>
<!-- Balance sheet tags --> <!-- Balance sheet tags -->
<record id="tag_de_asset_bs_A_I_1" model="account.account.tag"> <record id="tag_de_asset_bs_A_I_1" model="account.account.tag">
<field name="name">BS-Aktivseite: A I 1-Selbst geschaffene gewerbliche Schutzrechte und ähnliche Rechte und Werte</field> <field name="name">Bilanz-Aktiva: A I 1-Selbst geschaffene gewerbliche Schutzrechte und ähnliche Rechte und Werte</field>
<field name="applicability">accounts</field> <field name="applicability">accounts</field>
</record> </record>
<record id="tag_de_asset_bs_A_I_2" model="account.account.tag"> <record id="tag_de_asset_bs_A_I_2" model="account.account.tag">
<field name="name">BS-Aktivseite: A I 2-Konzessionen, Lizenzen und ähnliche Rechte und Werte</field> <field name="name">Bilanz-Aktiva: A I 2-Konzessionen, Lizenzen und ähnliche Rechte und Werte</field>
<field name="applicability">accounts</field> <field name="applicability">accounts</field>
</record> </record>
<record id="tag_de_asset_bs_A_I_3" model="account.account.tag"> <record id="tag_de_asset_bs_A_I_3" model="account.account.tag">
<field name="name">BS-Aktivseite: A I 3-Geschäfts- oder Firmenwert</field> <field name="name">Bilanz-Aktiva: A I 3-Geschäfts- oder Firmenwert</field>
<field name="applicability">accounts</field> <field name="applicability">accounts</field>
</record> </record>
<record id="tag_de_asset_bs_A_I_4" model="account.account.tag"> <record id="tag_de_asset_bs_A_I_4" model="account.account.tag">
<field name="name">BS-Aktivseite: A I 4-geleistete Anzahlungen</field> <field name="name">Bilanz-Aktiva: A I 4-geleistete Anzahlungen</field>
<field name="applicability">accounts</field> <field name="applicability">accounts</field>
</record> </record>
<record id="tag_de_asset_bs_A_II_1" model="account.account.tag"> <record id="tag_de_asset_bs_A_II_1" model="account.account.tag">
<field name="name">BS-Aktivseite: A II 1-Grundstücke. grundstücksgleiche Rechte und Bauten</field> <field name="name">Bilanz-Aktiva: A II 1-Grundstücke. grundstücksgleiche Rechte und Bauten</field>
<field name="applicability">accounts</field> <field name="applicability">accounts</field>
</record> </record>
<record id="tag_de_asset_bs_A_II_2" model="account.account.tag"> <record id="tag_de_asset_bs_A_II_2" model="account.account.tag">
<field name="name">BS-Aktivseite: A II 2-Technische Anlagen und Maschinen</field> <field name="name">Bilanz-Aktiva: A II 2-Technische Anlagen und Maschinen</field>
<field name="applicability">accounts</field> <field name="applicability">accounts</field>
</record> </record>
<record id="tag_de_asset_bs_A_II_3" model="account.account.tag"> <record id="tag_de_asset_bs_A_II_3" model="account.account.tag">
<field name="name">BS-Aktivseite: A II 3-Andere Anlagen. Betriebs- und Geschäftsausstattung</field> <field name="name">Bilanz-Aktiva: A II 3-Andere Anlagen. Betriebs- und Geschäftsausstattung</field>
<field name="applicability">accounts</field> <field name="applicability">accounts</field>
</record> </record>
<record id="tag_de_asset_bs_A_II_4" model="account.account.tag"> <record id="tag_de_asset_bs_A_II_4" model="account.account.tag">
<field name="name">BS-Aktivseite: A II 4-Geleistete Anzahlungen und Anlagen im Bau</field> <field name="name">Bilanz-Aktiva: A II 4-Geleistete Anzahlungen und Anlagen im Bau</field>
<field name="applicability">accounts</field> <field name="applicability">accounts</field>
</record> </record>
<record id="tag_de_asset_bs_A_III_1" model="account.account.tag"> <record id="tag_de_asset_bs_A_III_1" model="account.account.tag">
<field name="name">BS-Aktivseite: A III 1-Anteile an verbundenen Unternehmen</field> <field name="name">Bilanz-Aktiva: A III 1-Anteile an verbundenen Unternehmen</field>
<field name="applicability">accounts</field> <field name="applicability">accounts</field>
</record> </record>
<record id="tag_de_asset_bs_A_III_2" model="account.account.tag"> <record id="tag_de_asset_bs_A_III_2" model="account.account.tag">
<field name="name">BS-Aktivseite: A III 2-Ausleihungen an verbundene Unternehmen</field> <field name="name">Bilanz-Aktiva: A III 2-Ausleihungen an verbundene Unternehmen</field>
<field name="applicability">accounts</field> <field name="applicability">accounts</field>
</record> </record>
<record id="tag_de_asset_bs_A_III_3" model="account.account.tag"> <record id="tag_de_asset_bs_A_III_3" model="account.account.tag">
<field name="name">BS-Aktivseite: A III 3-Beteiligungen</field> <field name="name">Bilanz-Aktiva: A III 3-Beteiligungen</field>
<field name="applicability">accounts</field> <field name="applicability">accounts</field>
</record> </record>
<record id="tag_de_asset_bs_A_III_4" model="account.account.tag"> <record id="tag_de_asset_bs_A_III_4" model="account.account.tag">
<field name="name">BS-Aktivseite: A III 4-Ausleihungen an Unternehmen, mit denen ein Beteiligungsverhältnis besteht</field> <field name="name">Bilanz-Aktiva: A III 4-Ausleihungen an Unternehmen, mit denen ein Beteiligungsverhältnis besteht</field>
<field name="applicability">accounts</field> <field name="applicability">accounts</field>
</record> </record>
<record id="tag_de_asset_bs_A_III_5" model="account.account.tag"> <record id="tag_de_asset_bs_A_III_5" model="account.account.tag">
<field name="name">BS-Aktivseite: A III 5-Wertpapiere des Anlagevermögens</field> <field name="name">Bilanz-Aktiva: A III 5-Wertpapiere des Anlagevermögens</field>
<field name="applicability">accounts</field> <field name="applicability">accounts</field>
</record> </record>
<record id="tag_de_asset_bs_A_III_6" model="account.account.tag"> <record id="tag_de_asset_bs_A_III_6" model="account.account.tag">
<field name="name">BS-Aktivseite: A III 6-sonstige Ausleihungen</field> <field name="name">Bilanz-Aktiva: A III 6-sonstige Ausleihungen</field>
<field name="applicability">accounts</field> <field name="applicability">accounts</field>
</record> </record>
<record id="tag_de_asset_bs_B_I_1" model="account.account.tag"> <record id="tag_de_asset_bs_B_I_1" model="account.account.tag">
<field name="name">BS-Aktivseite: B I 1-Roh-, Hilfs- und Betriebsstoffe</field> <field name="name">Bilanz-Aktiva: B I 1-Roh-, Hilfs- und Betriebsstoffe</field>
<field name="applicability">accounts</field> <field name="applicability">accounts</field>
</record> </record>
<record id="tag_de_asset_bs_B_I_2" model="account.account.tag"> <record id="tag_de_asset_bs_B_I_2" model="account.account.tag">
<field name="name">BS-Aktivseite: B I 2-Unfertige Erzeugnisse, unfertige Leistungen</field> <field name="name">Bilanz-Aktiva: B I 2-Unfertige Erzeugnisse, unfertige Leistungen</field>
<field name="applicability">accounts</field> <field name="applicability">accounts</field>
</record> </record>
<record id="tag_de_asset_bs_B_I_3" model="account.account.tag"> <record id="tag_de_asset_bs_B_I_3" model="account.account.tag">
<field name="name">BS-Aktivseite: B I 3-Fertige Erzeugnisse und Waren</field> <field name="name">Bilanz-Aktiva: B I 3-Fertige Erzeugnisse und Waren</field>
<field name="applicability">accounts</field> <field name="applicability">accounts</field>
</record> </record>
<record id="tag_de_asset_bs_B_I_4" model="account.account.tag"> <record id="tag_de_asset_bs_B_I_4" model="account.account.tag">
<field name="name">BS-Aktivseite: B I 4-Geleistete Anzahlungen</field> <field name="name">Bilanz-Aktiva: B I 4-Geleistete Anzahlungen</field>
<field name="applicability">accounts</field> <field name="applicability">accounts</field>
</record> </record>
<record id="tag_de_asset_bs_B_II_1" model="account.account.tag"> <record id="tag_de_asset_bs_B_II_1" model="account.account.tag">
<field name="name">BS-Aktivseite: B II 1-Forderungen aus Lieferungen und Leistungen</field> <field name="name">Bilanz-Aktiva: B II 1-Forderungen aus Lieferungen und Leistungen</field>
<field name="applicability">accounts</field> <field name="applicability">accounts</field>
</record> </record>
<record id="tag_de_asset_bs_B_II_2" model="account.account.tag"> <record id="tag_de_asset_bs_B_II_2" model="account.account.tag">
<field name="name">BS-Aktivseite: B II 2-Forderungen gegen verbundene Unternehmen</field> <field name="name">Bilanz-Aktiva: B II 2-Forderungen gegen verbundene Unternehmen</field>
<field name="applicability">accounts</field> <field name="applicability">accounts</field>
</record> </record>
<record id="tag_de_asset_bs_B_II_3" model="account.account.tag"> <record id="tag_de_asset_bs_B_II_3" model="account.account.tag">
<field name="name">BS-Aktivseite: B II 3-Forderungen gegen Unternehmen, mit denen ein Beteiligungsverhältnis besteht</field> <field name="name">Bilanz-Aktiva: B II 3-Forderungen gegen Unternehmen, mit denen ein Beteiligungsverhältnis besteht</field>
<field name="applicability">accounts</field> <field name="applicability">accounts</field>
</record> </record>
<record id="tag_de_asset_bs_B_II_4" model="account.account.tag"> <record id="tag_de_asset_bs_B_II_4" model="account.account.tag">
<field name="name">BS-Aktivseite: B II 4-Sonstige Vermögensgegenstände</field> <field name="name">Bilanz-Aktiva: B II 4-Sonstige Vermögensgegenstände</field>
<field name="applicability">accounts</field> <field name="applicability">accounts</field>
</record> </record>
<record id="tag_de_asset_bs_B_III_1" model="account.account.tag"> <record id="tag_de_asset_bs_B_III_1" model="account.account.tag">
<field name="name">BS-Aktivseite: B III 1-Anteile an verbundenen Unternehmen</field> <field name="name">Bilanz-Aktiva: B III 1-Anteile an verbundenen Unternehmen</field>
<field name="applicability">accounts</field> <field name="applicability">accounts</field>
</record> </record>
<record id="tag_de_asset_bs_B_III_2" model="account.account.tag"> <record id="tag_de_asset_bs_B_III_2" model="account.account.tag">
<field name="name">BS-Aktivseite: B III 2-sonstige Wertpapiere</field> <field name="name">Bilanz-Aktiva: B III 2-sonstige Wertpapiere</field>
<field name="applicability">accounts</field> <field name="applicability">accounts</field>
</record> </record>
<record id="tag_de_asset_bs_B_IV" model="account.account.tag"> <record id="tag_de_asset_bs_B_IV" model="account.account.tag">
<field name="name">BS-Aktivseite: B IV-Kassenbestand, Bundesbankguthaben, Guthaben bei Kreditinstituten und Schecks</field> <field name="name">Bilanz-Aktiva: B IV-Kassenbestand, Bundesbankguthaben, Guthaben bei Kreditinstituten und Schecks</field>
<field name="applicability">accounts</field> <field name="applicability">accounts</field>
</record> </record>
<record id="tag_de_asset_bs_C" model="account.account.tag"> <record id="tag_de_asset_bs_C" model="account.account.tag">
<field name="name">BS-Aktivseite: C-Rechnungsabgrenzungsposten</field> <field name="name">Bilanz-Aktiva: C-Rechnungsabgrenzungsposten</field>
<field name="applicability">accounts</field> <field name="applicability">accounts</field>
</record> </record>
<record id="tag_de_asset_bs_D" model="account.account.tag"> <record id="tag_de_asset_bs_D" model="account.account.tag">
<field name="name">BS-Aktivseite: D-Aktive latente Steuern</field> <field name="name">Bilanz-Aktiva: D-Aktive latente Steuern</field>
<field name="applicability">accounts</field> <field name="applicability">accounts</field>
</record> </record>
<record id="tag_de_asset_bs_E" model="account.account.tag"> <record id="tag_de_asset_bs_E" model="account.account.tag">
<field name="name">BS-Aktivseite: E-Aktiver Unterschiedsbetrag aus der Vermögensverrechnung</field> <field name="name">Bilanz-Aktiva: E-Aktiver Unterschiedsbetrag aus der Vermögensverrechnung</field>
<field name="applicability">accounts</field> <field name="applicability">accounts</field>
</record> </record>
<record id="tag_de_liabilities_bs_A_I" model="account.account.tag"> <record id="tag_de_liabilities_bs_A_I" model="account.account.tag">
<field name="name">BS-Passivseite: A I-Gezeichnetes Kapital</field> <field name="name">Bilanz-Passiva: A I-Gezeichnetes Kapital</field>
<field name="applicability">accounts</field> <field name="applicability">accounts</field>
</record> </record>
<record id="tag_de_liabilities_bs_A_II" model="account.account.tag"> <record id="tag_de_liabilities_bs_A_II" model="account.account.tag">
<field name="name">BS-Passivseite: A II-Kapitalrücklage</field> <field name="name">Bilanz-Passiva: A II-Kapitalrücklage</field>
<field name="applicability">accounts</field> <field name="applicability">accounts</field>
</record> </record>
<record id="tag_de_liabilities_bs_A_III_1" model="account.account.tag"> <record id="tag_de_liabilities_bs_A_III_1" model="account.account.tag">
<field name="name">BS-Passivseite: A III 1-Gesetzliche Rücklage</field> <field name="name">Bilanz-Passiva: A III 1-Gesetzliche Rücklage</field>
<field name="applicability">accounts</field> <field name="applicability">accounts</field>
</record> </record>
<record id="tag_de_liabilities_bs_A_III_2" model="account.account.tag"> <record id="tag_de_liabilities_bs_A_III_2" model="account.account.tag">
<field name="name">BS-Passivseite: A III 2-Rücklage für Anteile an einem herrschenden oder mehrheitlich beteiligten Unternehmen</field> <field name="name">Bilanz-Passiva: A III 2-Rücklage für Anteile an einem herrschenden oder mehrheitlich beteiligten Unternehmen</field>
<field name="applicability">accounts</field> <field name="applicability">accounts</field>
</record> </record>
<record id="tag_de_liabilities_bs_A_III_3" model="account.account.tag"> <record id="tag_de_liabilities_bs_A_III_3" model="account.account.tag">
<field name="name">BS-Passivseite: A III 3-Satzungsmäßige Rücklagen</field> <field name="name">Bilanz-Passiva: A III 3-Satzungsmäßige Rücklagen</field>
<field name="applicability">accounts</field> <field name="applicability">accounts</field>
</record> </record>
<record id="tag_de_liabilities_bs_A_III_4" model="account.account.tag"> <record id="tag_de_liabilities_bs_A_III_4" model="account.account.tag">
<field name="name">BS-Passivseite: A III 4-Andere Gewinnrücklagen</field> <field name="name">Bilanz-Passiva: A III 4-Andere Gewinnrücklagen</field>
<field name="applicability">accounts</field> <field name="applicability">accounts</field>
</record> </record>
<record id="tag_de_liabilities_bs_A_IV" model="account.account.tag"> <record id="tag_de_liabilities_bs_A_IV" model="account.account.tag">
<field name="name">BS-Passivseite: A IV-Gewinnvortrag/Verlustvortrag</field> <field name="name">Bilanz-Passiva: A IV-Gewinnvortrag/Verlustvortrag</field>
<field name="applicability">accounts</field> <field name="applicability">accounts</field>
</record> </record>
<record id="tag_de_liabilities_bs_A_V" model="account.account.tag"> <record id="tag_de_liabilities_bs_A_V" model="account.account.tag">
<field name="name">BS-Passivseite: A V-Jahresüberschuß/Jahresfehlbetrag</field> <field name="name">Bilanz-Passiva: A V-Jahresüberschuß/Jahresfehlbetrag</field>
<field name="applicability">accounts</field> <field name="applicability">accounts</field>
</record> </record>
<record id="tag_de_liabilities_bs_B" model="account.account.tag"> <record id="tag_de_liabilities_bs_B" model="account.account.tag">
<field name="name">BS-Passivseite: B Sonderposten mit Rücklageanteil</field> <field name="name">Bilanz-Passiva: B Sonderposten mit Rücklageanteil</field>
<field name="applicability">accounts</field> <field name="applicability">accounts</field>
</record> </record>
<record id="tag_de_liabilities_bs_C_1" model="account.account.tag"> <record id="tag_de_liabilities_bs_C_1" model="account.account.tag">
<field name="name">BS-Passivseite: C 1-Rückstellungen für Pensionen und ähnliche Verpflichtungen</field> <field name="name">Bilanz-Passiva: C 1-Rückstellungen für Pensionen und ähnliche Verpflichtungen</field>
<field name="applicability">accounts</field> <field name="applicability">accounts</field>
</record> </record>
<record id="tag_de_liabilities_bs_C_2" model="account.account.tag"> <record id="tag_de_liabilities_bs_C_2" model="account.account.tag">
<field name="name">BS-Passivseite: C 2-Steuerrückstellungen</field> <field name="name">Bilanz-Passiva: C 2-Steuerrückstellungen</field>
<field name="applicability">accounts</field> <field name="applicability">accounts</field>
</record> </record>
<record id="tag_de_liabilities_bs_C_3" model="account.account.tag"> <record id="tag_de_liabilities_bs_C_3" model="account.account.tag">
<field name="name">BS-Passivseite: C 3-Sonstige Rückstellungen</field> <field name="name">Bilanz-Passiva: C 3-Sonstige Rückstellungen</field>
<field name="applicability">accounts</field> <field name="applicability">accounts</field>
</record> </record>
<record id="tag_de_liabilities_bs_D_1" model="account.account.tag"> <record id="tag_de_liabilities_bs_D_1" model="account.account.tag">
<field name="name">BS-Passivseite: D 1-Anleihen, davon konvertibeln</field> <field name="name">Bilanz-Passiva: D 1-Anleihen, davon konvertibeln</field>
<field name="applicability">accounts</field> <field name="applicability">accounts</field>
</record> </record>
<record id="tag_de_liabilities_bs_D_2" model="account.account.tag"> <record id="tag_de_liabilities_bs_D_2" model="account.account.tag">
<field name="name">BS-Passivseite: D 2-Verbindlichkeiten gegenüber Kreditinstituten</field> <field name="name">Bilanz-Passiva: D 2-Verbindlichkeiten gegenüber Kreditinstituten</field>
<field name="applicability">accounts</field> <field name="applicability">accounts</field>
</record> </record>
<record id="tag_de_liabilities_bs_D_3" model="account.account.tag"> <record id="tag_de_liabilities_bs_D_3" model="account.account.tag">
<field name="name">BS-Passivseite: D 3-Erhaltene Anzahlungen auf Bestellungen</field> <field name="name">Bilanz-Passiva: D 3-Erhaltene Anzahlungen auf Bestellungen</field>
<field name="applicability">accounts</field> <field name="applicability">accounts</field>
</record> </record>
<record id="tag_de_liabilities_bs_D_4" model="account.account.tag"> <record id="tag_de_liabilities_bs_D_4" model="account.account.tag">
<field name="name">BS-Passivseite: D 4-Verbindlichkeiten aus Lieferungen und Leistungen</field> <field name="name">Bilanz-Passiva: D 4-Verbindlichkeiten aus Lieferungen und Leistungen</field>
<field name="applicability">accounts</field> <field name="applicability">accounts</field>
</record> </record>
<record id="tag_de_liabilities_bs_D_5" model="account.account.tag"> <record id="tag_de_liabilities_bs_D_5" model="account.account.tag">
<field name="name">BS-Passivseite: D 5-Verbindlichkeiten aus der Annahme gezogener Wechsel und der Ausstellung eigener Wechsel</field> <field name="name">Bilanz-Passiva: D 5-Verbindlichkeiten aus der Annahme gezogener Wechsel und der Ausstellung eigener Wechsel</field>
<field name="applicability">accounts</field> <field name="applicability">accounts</field>
</record> </record>
<record id="tag_de_liabilities_bs_D_6" model="account.account.tag"> <record id="tag_de_liabilities_bs_D_6" model="account.account.tag">
<field name="name">BS-Passivseite: D 6-Verbindlichkeiten gegenüber verbundenen Unternehmen</field> <field name="name">Bilanz-Passiva: D 6-Verbindlichkeiten gegenüber verbundenen Unternehmen</field>
<field name="applicability">accounts</field> <field name="applicability">accounts</field>
</record> </record>
<record id="tag_de_liabilities_bs_D_7" model="account.account.tag"> <record id="tag_de_liabilities_bs_D_7" model="account.account.tag">
<field name="name">BS-Passivseite: D 7-Verbindlichkeiten gegenüber Unternehmen, mit denen ein Beteiligungsverhältnis besteht</field> <field name="name">Bilanz-Passiva: D 7-Verbindlichkeiten gegenüber Unternehmen, mit denen ein Beteiligungsverhältnis besteht</field>
<field name="applicability">accounts</field> <field name="applicability">accounts</field>
</record> </record>
<record id="tag_de_liabilities_bs_D_8" model="account.account.tag"> <record id="tag_de_liabilities_bs_D_8" model="account.account.tag">
<field name="name">BS-Passivseite: D 8-Sonstige Verbindlichkeiten, davon aus Steuern, davon im Rahmen der sozialen Sicherheit</field> <field name="name">Bilanz-Passiva: D 8-Sonstige Verbindlichkeiten, davon aus Steuern, davon im Rahmen der sozialen Sicherheit</field>
<field name="applicability">accounts</field> <field name="applicability">accounts</field>
</record> </record>
<record id="tag_de_liabilities_bs_E" model="account.account.tag"> <record id="tag_de_liabilities_bs_E" model="account.account.tag">
<field name="name">BS-Passivseite: E-Rechnungsabgrenzungsposten</field> <field name="name">Bilanz-Passiva: E-Rechnungsabgrenzungsposten</field>
<field name="applicability">accounts</field> <field name="applicability">accounts</field>
</record> </record>
<record id="tag_de_liabilities_bs_F" model="account.account.tag"> <record id="tag_de_liabilities_bs_F" model="account.account.tag">
<field name="name">BS-Passivseite: F-Passive latente Steuern</field> <field name="name">Bilanz-Passiva: F-Passive latente Steuern</field>
<field name="applicability">accounts</field> <field name="applicability">accounts</field>
</record> </record>
+18 -1
View File
@@ -1,4 +1,6 @@
from odoo import fields, models from odoo import api, fields, models
from odoo.exceptions import UserError
from odoo.tools.translate import _
class AccountTaxTemplate(models.Model): class AccountTaxTemplate(models.Model):
_inherit = 'account.tax.template' _inherit = 'account.tax.template'
@@ -14,3 +16,18 @@ class AccountTax(models.Model):
_inherit = "account.tax" _inherit = "account.tax"
l10n_de_datev_code = fields.Char(size=2, help="2 digits code use by Datev") l10n_de_datev_code = fields.Char(size=2, help="2 digits code use by Datev")
class AccountInvoice(models.Model):
_inherit = "account.invoice"
def invoice_validate(self):
for invoice in self:
for line in invoice.invoice_line_ids:
account_tax = line.account_id.tax_ids.ids
if account_tax and invoice.company_id.country_id.code == 'DE':
account_name = line.account_id.name
for tax in line.invoice_line_tax_ids:
if tax.id not in account_tax:
raise UserError(_('Account %s does not authorize to have tax %s specified on the line. \
Change the tax used in this invoice or remove all taxes from the account') % (account_name, tax.name))
return super(AccountInvoice, self).invoice_validate()
+18 -37
View File
@@ -5,22 +5,24 @@
# ===== # =====
# Dieses Modul bietet Ihnen einen deutschen Kontenplan basierend auf dem SKR03. # Dieses Modul bietet Ihnen einen deutschen Kontenplan basierend auf dem SKR03.
# Gemäss der aktuellen Einstellungen ist die Firma nicht Umsatzsteuerpflichtig. # Gemäss der aktuellen Einstellungen ist ein neues Unternehmen in Odoo
# Diese Grundeinstellung ist sehr einfach zu ändern und bedarf in der Regel # Umsatzsteuerpflichtig. Zahlreiche Erlös- und Aufwandskonten enthalten
# grundsätzlich eine initiale Zuweisung von Steuerkonten zu Produkten und / oder # bereits eine zugeordnete Steuer. Hierdurch wird für diese Konten bereits
# Sachkonten oder zu Partnern. # die richtige Vorsteuer (Eingangsrechnungen) bzw. Umsatzsteuer
# Die Umsatzsteuern (voller Steuersatz, reduzierte Steuer und steuerfrei) # (Ausgangsrechnungen) automatisch ausgewählt.
# sollten bei den Produktstammdaten hinterlegt werden (in Abhängigkeit der #
# Steuervorschriften). Die Zuordnung erfolgt auf dem Aktenreiter Finanzbuchhaltung # Die Zuordnung von Steuerkonten zu Produkten und / oder Sachkonten kann
# (Kategorie: Umsatzsteuer). # für den jeweiligen betrieblichen Anwendungszweck überarbeitet oder
# Die Vorsteuern (voller Steuersatz, reduzierte Steuer und steuerfrei) # auch erweitert werden.
# sollten ebenso bei den Produktstammdaten hinterlegt werden (in Abhängigkeit # Die mit diesem Kontenrahmen installierten Steuerschlüssel (z.B. 19%, 7%,
# der Steuervorschriften). Die Zuordnung erfolgt auf dem Aktenreiter # steuerfrei) können hierzu bei den Produktstammdaten hinterlegt werden
# Finanzbuchhaltung (Kategorie: Vorsteuer). # (in Abhängigkeit der Steuervorschriften). Die Zuordnung erfolgt auf
# dem Aktenreiter Finanzbuchhaltung (Kategorie: Umsatzsteuer / Vorsteuer).
# Die Zuordnung der Steuern für Ein- und Ausfuhren aus EU Ländern, sowie auch # Die Zuordnung der Steuern für Ein- und Ausfuhren aus EU Ländern, sowie auch
# für den Ein- und Verkauf aus und in Drittländer sollten beim Partner # für den Ein- und Verkauf aus und in Drittländer sollten beim Partner
# (Lieferant/Kunde)hinterlegt werden (in Anhängigkeit vom Herkunftsland # (Lieferant / Kunde) hinterlegt werden (in Anhängigkeit vom Herkunftsland
# des Lieferanten/Kunden). Die Zuordnung beim Kunden ist 'höherwertig' als # des Lieferanten/Kunden). Diese Zuordnung ist 'höherwertig' als
# die Zuordnung bei Produkten und überschreibt diese im Einzelfall. # die Zuordnung bei Produkten und überschreibt diese im Einzelfall.
# #
# Zur Vereinfachung der Steuerausweise und Buchung bei Auslandsgeschäften # Zur Vereinfachung der Steuerausweise und Buchung bei Auslandsgeschäften
@@ -28,32 +30,10 @@
# (z.B. Zuordnung 'Umsatzsteuer 19%' zu 'steuerfreie Einfuhren aus der EU') # (z.B. Zuordnung 'Umsatzsteuer 19%' zu 'steuerfreie Einfuhren aus der EU')
# zwecks Zuordnung dieses Mappings zum ausländischen Partner (Kunde/Lieferant). # zwecks Zuordnung dieses Mappings zum ausländischen Partner (Kunde/Lieferant).
# Die Rechnungsbuchung beim Einkauf bewirkt folgendes:
# Die Steuerbemessungsgrundlage (exklusive Steuer) wird ausgewiesen bei den
# jeweiligen Kategorien für den Vorsteuer Steuermessbetrag (z.B. Vorsteuer
# Steuermessbetrag Voller Steuersatz 19%).
# Der Steuerbetrag erscheint unter der Kategorie 'Vorsteuern' (z.B. Vorsteuer
# 19%). Durch multidimensionale Hierachien können verschiedene Positionen
# zusammengefasst werden und dann in Form eines Reports ausgegeben werden.
#
# Die Rechnungsbuchung beim Verkauf bewirkt folgendes:
# Die Steuerbemessungsgrundlage (exklusive Steuer) wird ausgewiesen bei den
# jeweiligen Kategorien für den Umsatzsteuer Steuermessbetrag
# (z.B. Umsatzsteuer Steuermessbetrag Voller Steuersatz 19%).
# Der Steuerbetrag erscheint unter der Kategorie 'Umsatzsteuer'
# (z.B. Umsatzsteuer 19%). Durch multidimensionale Hierachien können
# verschiedene Positionen zusammengefasst werden.
# Die zugewiesenen Steuerausweise können auf Ebene der einzelnen
# Rechnung (Eingangs- und Ausgangsrechnung) nachvollzogen werden,
# und dort gegebenenfalls angepasst werden.
# Rechnungsgutschriften führen zu einer Korrektur (Gegenposition)
# der Steuerbuchung, in Form einer spiegelbildlichen Buchung.
{ {
'name': 'Deutschland SKR03 - Accounting', 'name': 'Deutschland SKR03 - Accounting',
'version': '2.0', 'version': '3.0',
'author': 'openbig.org', 'author': 'openbig.org',
'website': 'http://www.openbig.org', 'website': 'http://www.openbig.org',
'category': 'Localization', 'category': 'Localization',
@@ -68,6 +48,7 @@ German accounting chart and localization.
'data/l10n_de_skr03_chart_data.xml', 'data/l10n_de_skr03_chart_data.xml',
'data/account_data.xml', 'data/account_data.xml',
'data/account_tax_fiscal_position_data.xml', 'data/account_tax_fiscal_position_data.xml',
'data/account_reconcile_model_template.xml',
'data/account_chart_template_data.xml', 'data/account_chart_template_data.xml',
], ],
'auto_install': True 'auto_install': True
+12 -3
View File
@@ -4,13 +4,22 @@
<!-- Account Tax Group --> <!-- Account Tax Group -->
<record id="tax_group_0" model="account.tax.group"> <record id="tax_group_0" model="account.tax.group">
<field name="name">Tax 0%</field> <field name="name">USt 0%</field>
</record> </record>
<record id="tax_group_7" model="account.tax.group"> <record id="tax_group_7" model="account.tax.group">
<field name="name">Tax 7%</field> <field name="name">USt 7%</field>
</record>
<record id="tax_group_55" model="account.tax.group">
<field name="name">USt 5,5%</field>
</record>
<record id="tax_group_107" model="account.tax.group">
<field name="name">USt 10,7%</field>
</record>
<record id="tax_group_x" model="account.tax.group">
<field name="name">USt x%</field>
</record> </record>
<record id="tax_group_19" model="account.tax.group"> <record id="tax_group_19" model="account.tax.group">
<field name="name">Tax 19%</field> <field name="name">USt 19%</field>
</record> </record>
</data> </data>
</odoo> </odoo>
@@ -0,0 +1,59 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data noupdate="1">
<record id="reconcile_3731" model="account.reconcile.model.template">
<field name="name">Skonto-EK-7%</field>
<field name="account_id" ref="account_3731"/>
<field name="amount_type">percentage</field>
<field name="tax_id" ref="tax_vst_7_taxinclusive_skr03"/>
<field name="amount">100</field>
<field name="label">Skonto-EK-7%</field>
<field name="chart_template_id" ref="l10n_de_chart_template"/>
</record>
<record id="reconcile_3736" model="account.reconcile.model.template">
<field name="name">Skonto-EK-19%</field>
<field name="account_id" ref="account_3736"/>
<field name="amount_type">percentage</field>
<field name="tax_id" ref="tax_vst_19_taxinclusive_skr03"/>
<field name="amount">100</field>
<field name="label">Skonto-EK-19%</field>
<field name="chart_template_id" ref="l10n_de_chart_template"/>
</record>
<record id="reconcile_8731" model="account.reconcile.model.template">
<field name="name">Skonto-VK-7%</field>
<field name="account_id" ref="account_8731"/>
<field name="amount_type">percentage</field>
<field name="tax_id" ref="tax_ust_7_taxinclusive_skr03"/>
<field name="amount">100</field>
<field name="label">Skonto-VK-7%</field>
<field name="chart_template_id" ref="l10n_de_chart_template"/>
</record>
<record id="reconcile_8736" model="account.reconcile.model.template">
<field name="name">Skonto-VK-19%</field>
<field name="account_id" ref="account_8736"/>
<field name="amount_type">percentage</field>
<field name="tax_id" ref="tax_ust_19_taxinclusive_skr03"/>
<field name="amount">100</field>
<field name="label">Skonto-VK-19%</field>
<field name="chart_template_id" ref="l10n_de_chart_template"/>
</record>
<record id="reconcile_2401" model="account.reconcile.model.template">
<field name="name">Forderungsverlust-7%</field>
<field name="account_id" ref="account_2401"/>
<field name="amount_type">percentage</field>
<field name="tax_id" ref="tax_ust_7_taxinclusive_skr03"/>
<field name="amount">100</field>
<field name="label">Forderungsverlust-7%</field>
<field name="chart_template_id" ref="l10n_de_chart_template"/>
</record>
<record id="reconcile_2406" model="account.reconcile.model.template">
<field name="name">Forderungsverlust-19%</field>
<field name="account_id" ref="account_2406"/>
<field name="amount_type">percentage</field>
<field name="tax_id" ref="tax_ust_19_taxinclusive_skr03"/>
<field name="amount">100</field>
<field name="label">Forderungsverlust-19%</field>
<field name="chart_template_id" ref="l10n_de_chart_template"/>
</record>
</data>
</odoo>
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+18 -40
View File
@@ -3,26 +3,25 @@
# SKR04 # SKR04
# ===== # =====
# Dieses Modul bietet Ihnen einen deutschen Kontenplan basierend auf dem SKR03.
# Gemäss der aktuellen Einstellungen ist ein neues Unternehmen in Odoo
# Umsatzsteuerpflichtig. Zahlreiche Erlös- und Aufwandskonten enthalten
# bereits eine zugeordnete Steuer. Hierdurch wird für diese Konten bereits
# die richtige Vorsteuer (Eingangsrechnungen) bzw. Umsatzsteuer
# (Ausgangsrechnungen) automatisch ausgewählt.
#
# Die Zuordnung von Steuerkonten zu Produkten und / oder Sachkonten kann
# für den jeweiligen betrieblichen Anwendungszweck überarbeitet oder
# auch erweitert werden.
# Die mit diesem Kontenrahmen installierten Steuerschlüssel (z.B. 19%, 7%,
# steuerfrei) können hierzu bei den Produktstammdaten hinterlegt werden
# (in Abhängigkeit der Steuervorschriften). Die Zuordnung erfolgt auf
# dem Aktenreiter Finanzbuchhaltung (Kategorie: Umsatzsteuer / Vorsteuer).
# Dieses Modul bietet Ihnen einen deutschen Kontenplan basierend auf dem SKR04.
# Gemäss der aktuellen Einstellungen ist die Firma nicht Umsatzsteuerpflichtig,
# d.h. im Standard existiert keine Zuordnung von Produkten und Sachkonten zu
# Steuerschlüsseln.
# Diese Grundeinstellung ist sehr einfach zu ändern und bedarf in der Regel
# grundsätzlich eine initiale Zuweisung von Steuerschlüsseln zu Produkten und / oder
# Sachkonten oder zu Partnern.
# Die Umsatzsteuern (voller Steuersatz, reduzierte Steuer und steuerfrei)
# sollten bei den Produktstammdaten hinterlegt werden (in Abhängigkeit der
# Steuervorschriften). Die Zuordnung erfolgt auf dem Aktenreiter Finanzbuchhaltung
# (Kategorie: Umsatzsteuer).
# Die Vorsteuern (voller Steuersatz, reduzierte Steuer und steuerfrei)
# sollten ebenso bei den Produktstammdaten hinterlegt werden (in Abhängigkeit
# der Steuervorschriften). Die Zuordnung erfolgt auf dem Aktenreiter
# Finanzbuchhaltung (Kategorie: Vorsteuer).
# Die Zuordnung der Steuern für Ein- und Ausfuhren aus EU Ländern, sowie auch # Die Zuordnung der Steuern für Ein- und Ausfuhren aus EU Ländern, sowie auch
# für den Ein- und Verkauf aus und in Drittländer sollten beim Partner # für den Ein- und Verkauf aus und in Drittländer sollten beim Partner
# (Lieferant/Kunde) hinterlegt werden (in Anhängigkeit vom Herkunftsland # (Lieferant / Kunde) hinterlegt werden (in Anhängigkeit vom Herkunftsland
# des Lieferanten/Kunden). Die Zuordnung beim Kunden ist 'höherwertig' als # des Lieferanten/Kunden). Diese Zuordnung ist 'höherwertig' als
# die Zuordnung bei Produkten und überschreibt diese im Einzelfall. # die Zuordnung bei Produkten und überschreibt diese im Einzelfall.
# #
# Zur Vereinfachung der Steuerausweise und Buchung bei Auslandsgeschäften # Zur Vereinfachung der Steuerausweise und Buchung bei Auslandsgeschäften
@@ -30,32 +29,10 @@
# (z.B. Zuordnung 'Umsatzsteuer 19%' zu 'steuerfreie Einfuhren aus der EU') # (z.B. Zuordnung 'Umsatzsteuer 19%' zu 'steuerfreie Einfuhren aus der EU')
# zwecks Zuordnung dieses Mappings zum ausländischen Partner (Kunde/Lieferant). # zwecks Zuordnung dieses Mappings zum ausländischen Partner (Kunde/Lieferant).
# Die Rechnungsbuchung beim Einkauf bewirkt folgendes:
# Die Steuerbemessungsgrundlage (exklusive Steuer) wird ausgewiesen bei den
# jeweiligen Kategorien für den Vorsteuer Steuermessbetrag (z.B. Vorsteuer
# Steuermessbetrag Voller Steuersatz 19%).
# Der Steuerbetrag erscheint unter der Kategorie 'Vorsteuern' (z.B. Vorsteuer
# 19%). Durch multidimensionale Hierachien können verschiedene Positionen
# zusammengefasst werden und dann in Form eines Reports ausgegeben werden.
#
# Die Rechnungsbuchung beim Verkauf bewirkt folgendes:
# Die Steuerbemessungsgrundlage (exklusive Steuer) wird ausgewiesen bei den
# jeweiligen Kategorien für den Umsatzsteuer Steuermessbetrag
# (z.B. Umsatzsteuer Steuermessbetrag Voller Steuersatz 19%).
# Der Steuerbetrag erscheint unter der Kategorie 'Umsatzsteuer'
# (z.B. Umsatzsteuer 19%). Durch multidimensionale Hierachien können
# verschiedene Positionen zusammengefasst werden.
# Die zugewiesenen Steuerausweise können auf Ebene der einzelnen
# Rechnung (Eingangs- und Ausgangsrechnung) nachvollzogen werden,
# und dort gegebenenfalls angepasst werden.
# Rechnungsgutschriften führen zu einer Korrektur (Gegenposition)
# der Steuerbuchung, in Form einer spiegelbildlichen Buchung.
{ {
'name': 'Deutschland SKR04 - Accounting', 'name': 'Deutschland SKR04 - Accounting',
'version': '2.0', 'version': '3.0',
'author': 'openbig.org', 'author': 'openbig.org',
'website': 'http://www.openbig.org', 'website': 'http://www.openbig.org',
'category': 'Localization', 'category': 'Localization',
@@ -70,6 +47,7 @@ German accounting chart and localization.
'data/l10n_de_skr04_chart_data.xml', 'data/l10n_de_skr04_chart_data.xml',
'data/account_data.xml', 'data/account_data.xml',
'data/account_tax_fiscal_position_data.xml', 'data/account_tax_fiscal_position_data.xml',
'data/account_reconcile_model_template.xml',
'data/account_chart_template_data.xml', 'data/account_chart_template_data.xml',
], ],
} }
+12 -3
View File
@@ -4,13 +4,22 @@
<!-- Account Tax Group --> <!-- Account Tax Group -->
<record id="tax_group_0" model="account.tax.group"> <record id="tax_group_0" model="account.tax.group">
<field name="name">Tax 0%</field> <field name="name">USt 0%</field>
</record> </record>
<record id="tax_group_7" model="account.tax.group"> <record id="tax_group_7" model="account.tax.group">
<field name="name">Tax 7%</field> <field name="name">USt 7%</field>
</record>
<record id="tax_group_55" model="account.tax.group">
<field name="name">USt 5,5%</field>
</record>
<record id="tax_group_107" model="account.tax.group">
<field name="name">USt 10,7%</field>
</record>
<record id="tax_group_x" model="account.tax.group">
<field name="name">USt x%</field>
</record> </record>
<record id="tax_group_19" model="account.tax.group"> <record id="tax_group_19" model="account.tax.group">
<field name="name">Tax 19%</field> <field name="name">USt 19%</field>
</record> </record>
</data> </data>
</odoo> </odoo>
@@ -0,0 +1,59 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data noupdate="1">
<record id="reconcile_5731" model="account.reconcile.model.template">
<field name="name">Skonto-EK-7%</field>
<field name="account_id" ref="chart_skr04_5731"/>
<field name="amount_type">percentage</field>
<field name="tax_id" ref="tax_vst_7_taxinclusive_skr04"/>
<field name="amount">100</field>
<field name="label">Skonto-EK-7%</field>
<field name="chart_template_id" ref="l10n_chart_de_skr04"/>
</record>
<record id="reconcile_5736" model="account.reconcile.model.template">
<field name="name">Skonto-EK-19%</field>
<field name="account_id" ref="chart_skr04_5736"/>
<field name="amount_type">percentage</field>
<field name="tax_id" ref="tax_vst_19_taxinclusive_skr04"/>
<field name="amount">100</field>
<field name="label">Skonto-EK-19%</field>
<field name="chart_template_id" ref="l10n_chart_de_skr04"/>
</record>
<record id="reconcile_4731" model="account.reconcile.model.template">
<field name="name">Skonto-VK-7%</field>
<field name="account_id" ref="chart_skr04_4731"/>
<field name="amount_type">percentage</field>
<field name="tax_id" ref="tax_ust_7_taxinclusive_skr04"/>
<field name="amount">100</field>
<field name="label">Skonto-VK-7%</field>
<field name="chart_template_id" ref="l10n_chart_de_skr04"/>
</record>
<record id="reconcile_4736" model="account.reconcile.model.template">
<field name="name">Skonto-VK-19%</field>
<field name="account_id" ref="chart_skr04_4736"/>
<field name="amount_type">percentage</field>
<field name="tax_id" ref="tax_ust_19_taxinclusive_skr04"/>
<field name="amount">100</field>
<field name="label">Skonto-VK-19%</field>
<field name="chart_template_id" ref="l10n_chart_de_skr04"/>
</record>
<record id="reconcile_6931" model="account.reconcile.model.template">
<field name="name">Forderungsverlust-7%</field>
<field name="account_id" ref="chart_skr04_6931"/>
<field name="amount_type">percentage</field>
<field name="tax_id" ref="tax_ust_7_taxinclusive_skr04"/>
<field name="amount">100</field>
<field name="label">Forderungsverlust-7%</field>
<field name="chart_template_id" ref="l10n_chart_de_skr04"/>
</record>
<record id="reconcile_6936" model="account.reconcile.model.template">
<field name="name">Forderungsverlust-19%</field>
<field name="account_id" ref="chart_skr04_6936"/>
<field name="amount_type">percentage</field>
<field name="tax_id" ref="tax_ust_19_taxinclusive_skr04"/>
<field name="amount">100</field>
<field name="label">Forderungsverlust-19%</field>
<field name="chart_template_id" ref="l10n_chart_de_skr04"/>
</record>
</data>
</odoo>
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -63,7 +63,7 @@ def format_amount(env, amount, currency):
lang = env['res.lang']._lang_get(env.context.get('lang') or 'en_US') lang = env['res.lang']._lang_get(env.context.get('lang') or 'en_US')
formatted_amount = lang.format(fmt, currency.round(amount), grouping=True, monetary=True)\ formatted_amount = lang.format(fmt, currency.round(amount), grouping=True, monetary=True)\
.replace(r' ', u'\N{NO-BREAK SPACE}').replace(r'-', u'\u2011') .replace(r' ', u'\N{NO-BREAK SPACE}').replace(r'-', u'-\N{ZERO WIDTH NO-BREAK SPACE}')
pre = post = u'' pre = post = u''
if currency.position == 'before': if currency.position == 'before':
@@ -255,6 +255,11 @@ class PosConfig(models.Model):
if any(self.journal_ids.mapped(lambda journal: journal.currency_id and journal.currency_id != self.currency_id)): if any(self.journal_ids.mapped(lambda journal: journal.currency_id and journal.currency_id != self.currency_id)):
raise ValidationError(_("All payment methods must be in the same currency as the Sales Journal or the company currency if that is not set.")) raise ValidationError(_("All payment methods must be in the same currency as the Sales Journal or the company currency if that is not set."))
@api.constrains('company_id', 'available_pricelist_ids')
def _check_companies(self):
if any(self.available_pricelist_ids.mapped(lambda pl: pl.company_id.id not in (False, self.company_id.id))):
raise ValidationError(_("The selected pricelists must belong to no company or the company of the point of sale."))
@api.onchange('iface_print_via_proxy') @api.onchange('iface_print_via_proxy')
def _onchange_iface_print_via_proxy(self): def _onchange_iface_print_via_proxy(self):
self.iface_print_auto = self.iface_print_via_proxy self.iface_print_auto = self.iface_print_via_proxy
+3
View File
@@ -182,6 +182,9 @@ class CustomerPortal(CustomerPortal):
@http.route(['/my/task/<int:task_id>'], type='http', auth="user", website=True) @http.route(['/my/task/<int:task_id>'], type='http', auth="user", website=True)
def portal_my_task(self, task_id=None, **kw): def portal_my_task(self, task_id=None, **kw):
task = request.env['project.task'].browse(task_id) task = request.env['project.task'].browse(task_id)
task.check_access_rights('read')
task.check_access_rule('read')
vals = { vals = {
'task': task, 'task': task,
'user': request.env.user 'user': request.env.user
+2 -1
View File
@@ -236,12 +236,13 @@
</div> </div>
<t t-foreach="order.order_line" t-as="ol"> <t t-foreach="order.order_line" t-as="ol">
<div class="row orders_vertical_align"> <div class="row orders_vertical_align">
<div class="visible-lg col-lg-1 text-center"> <div t-if="not request.env.user._is_public()" class="visible-lg col-lg-1 text-center">
<span t-field="ol.product_image" t-options="{'widget': 'image', 'class': 'img-rounded', 'style':'width: 48px;height:48px'}" /> <span t-field="ol.product_image" t-options="{'widget': 'image', 'class': 'img-rounded', 'style':'width: 48px;height:48px'}" />
</div> </div>
<div id='product_name' t-att-class="'col-lg-3 col-sm-5 col-xs-4' if display_discount else 'col-lg-4 col-sm-6 col-xs-3'"> <div id='product_name' t-att-class="'col-lg-3 col-sm-5 col-xs-4' if display_discount else 'col-lg-4 col-sm-6 col-xs-3'">
<span t-esc="ol.product_id.name"/> <span t-esc="ol.product_id.name"/>
</div> </div>
<div t-if="request.env.user._is_public()" class="visible-lg col-lg-1 text-center" /> <!-- Just for alignment -->
<div class="col-sm-3 hidden-xs text-right"> <div class="col-sm-3 hidden-xs text-right">
<span t-field="ol.price_unit" t-options='{"widget": "monetary", "display_currency": order.pricelist_id.currency_id}'/> <span t-field="ol.price_unit" t-options='{"widget": "monetary", "display_currency": order.pricelist_id.currency_id}'/>
</div> </div>
@@ -6,7 +6,7 @@
<record id="account_analytic_line_rule_billing_user" model="ir.rule"> <record id="account_analytic_line_rule_billing_user" model="ir.rule">
<field name="name">account.analytic.line.billing.user</field> <field name="name">account.analytic.line.billing.user</field>
<field name="model_id" ref="analytic.model_account_analytic_line"/> <field name="model_id" ref="analytic.model_account_analytic_line"/>
<field name="domain_force">[('project_id', '=', False)]</field> <field name="domain_force">[(1, '=', 1)]</field>
<field name="groups" eval="[(4, ref('account.group_account_invoice'))]"/> <field name="groups" eval="[(4, ref('account.group_account_invoice'))]"/>
<field name="perm_create" eval="1"/> <field name="perm_create" eval="1"/>
<field name="perm_write" eval="1"/> <field name="perm_write" eval="1"/>
+5 -5
View File
@@ -28,11 +28,11 @@ class Company(models.Model):
location.sudo().write({'company_id': company.id}) location.sudo().write({'company_id': company.id})
company.write({'internal_transit_location_id': location.id}) company.write({'internal_transit_location_id': location.id})
warehouses = self.env['stock.warehouse'].search([('partner_id', '=', self.partner_id.id)]) warehouses = self.env['stock.warehouse'].search([('partner_id', '=', company.partner_id.id)])
warehouses.mapped('partner_id').with_context(force_company=self.id).write({ warehouses.mapped('partner_id').with_context(force_company=company.id).write({
'property_stock_customer': location.id, 'property_stock_customer': location.id,
'property_stock_supplier': location.id, 'property_stock_supplier': location.id,
}) })
@api.model @api.model
def create(self, vals): def create(self, vals):
+1 -1
View File
@@ -25,7 +25,7 @@ class Http(models.AbstractModel):
return { return {
"session_id": request.session.sid, "session_id": request.session.sid,
"uid": request.session.uid, "uid": request.session.uid,
"is_system": user._is_system(), "is_system": user._is_system() if request.session.uid else False,
"is_superuser": user._is_superuser() if request.session.uid else False, "is_superuser": user._is_superuser() if request.session.uid else False,
"user_context": request.session.get_context() if request.session.uid else {}, "user_context": request.session.get_context() if request.session.uid else {},
"db": request.session.db, "db": request.session.db,
+1
View File
@@ -48,6 +48,7 @@ ol {
ul { ul {
list-style: disc; list-style: disc;
padding-left: 40px;
} }
ul ul { ul ul {
@@ -141,6 +141,7 @@ var KanbanColumnProgressBar = Widget.extend({
} }
// Display and animate the progress bars // Display and animate the progress bars
var barNumber = 0;
_.each(self.colors, function (val, key) { _.each(self.colors, function (val, key) {
var $bar = self.$bars[val]; var $bar = self.$bars[val];
var count = self.subgroupCounts && self.subgroupCounts[key] || 0; var count = self.subgroupCounts && self.subgroupCounts[key] || 0;
@@ -165,7 +166,14 @@ var KanbanColumnProgressBar = Widget.extend({
window.getComputedStyle($bar[0]).getPropertyValue('width'); // Force reflow so that animations work window.getComputedStyle($bar[0]).getPropertyValue('width'); // Force reflow so that animations work
if (count > 0) { if (count > 0) {
$bar.addClass('o_bar_has_records'); $bar.addClass('o_bar_has_records');
// Make sure every bar that has records has some space
// and that everything adds up to 100%
var minWidth = 6*barNumber;
var maxWidth = 100 - minWidth;
self.$('.progress-bar.o_bar_has_records').css('max-width', maxWidth + '%');
self.$('.progress-bar.o_bar_has_records').css('min-width', minWidth + '%');
$bar.css('width', (count * 100 / self.groupCount) + '%'); $bar.css('width', (count * 100 / self.groupCount) + '%');
barNumber++;
} else { } else {
$bar.css('width', ''); $bar.css('width', '');
} }
@@ -73,11 +73,6 @@
margin-bottom: 0; margin-bottom: 0;
box-shadow: none; box-shadow: none;
cursor: pointer; cursor: pointer;
// Be sure that a bar with data has a minimun width
&.o_bar_has_records {
min-width: 10px;
}
} }
.o_kanban_counter_label { .o_kanban_counter_label {
@@ -1519,7 +1519,7 @@ var LinkDialog = Dialog.extend({
+ ((size && size.length) ? (' btn-' + size) : ''); + ((size && size.length) ? (' btn-' + size) : '');
var isNewWindow = this.$('input[name="is_new_window"]').prop('checked'); var isNewWindow = this.$('input[name="is_new_window"]').prop('checked');
if (url.indexOf('@') >= 0 && url.indexOf('mailto:') < 0) { if (url.indexOf('@') >= 0 && url.indexOf('mailto:') < 0 && !url.match(/^http[s]?/i)) {
url = ('mailto:' + url); url = ('mailto:' + url);
} }
return { return {
@@ -72,7 +72,8 @@ class WebsiteHrRecruitment(http.Controller):
@http.route('/jobs/add', type='http', auth="user", website=True) @http.route('/jobs/add', type='http', auth="user", website=True)
def jobs_add(self, **kwargs): def jobs_add(self, **kwargs):
job = request.env['hr.job'].create({ # avoid branding of website_description by setting rendering_bundle in context
job = request.env['hr.job'].with_context(rendering_bundle=True).create({
'name': _('Job Title'), 'name': _('Job Title'),
}) })
return request.redirect("/jobs/detail/%s?enable_editor=1" % slug(job)) return request.redirect("/jobs/detail/%s?enable_editor=1" % slug(job))
@@ -76,4 +76,4 @@ class WebsiteSaleDelivery(WebsiteSale):
lang = request.env['res.lang']._lang_get(request.env.context.get('lang') or 'en_US') lang = request.env['res.lang']._lang_get(request.env.context.get('lang') or 'en_US')
return lang.format(fmt, currency.round(amount), grouping=True, monetary=True)\ return lang.format(fmt, currency.round(amount), grouping=True, monetary=True)\
.replace(r' ', u'\N{NO-BREAK SPACE}').replace(r'-', u'\u2011') .replace(r' ', u'\N{NO-BREAK SPACE}').replace(r'-', u'-\N{ZERO WIDTH NO-BREAK SPACE}')
+7
View File
@@ -310,6 +310,13 @@ customize the amount of logging output
daily, keeping 30 backups. Log rotation frequency and number of backups is daily, keeping 30 backups. Log rotation frequency and number of backups is
not configurable. not configurable.
.. danger::
Built-in log rotation is not reliable in multi-workers scenarios
and may incur significant data loss. It is *strongly recommended* to
use an external log rotation utility or use system loggers (--syslog)
instead.
.. option:: --syslog .. option:: --syslog
logs to the system's event logger: `syslog on unices <https://docs.python.org/2/library/logging.handlers.html#sysloghandler>`_ logs to the system's event logger: `syslog on unices <https://docs.python.org/2/library/logging.handlers.html#sysloghandler>`_
+6 -5
View File
@@ -7,6 +7,7 @@ from odoo import api, fields, models, _
from PIL import Image from PIL import Image
import babel import babel
from lxml import etree from lxml import etree
import math
from odoo.tools import html_escape as escape, posix_to_ldml, safe_eval, float_utils, format_date, pycompat from odoo.tools import html_escape as escape, posix_to_ldml, safe_eval, float_utils, format_date, pycompat
@@ -125,7 +126,7 @@ class IntegerConverter(models.AbstractModel):
@api.model @api.model
def value_to_html(self, value, options): def value_to_html(self, value, options):
return pycompat.to_text(self.user_lang().format('%d', value, grouping=True).replace(r'-', u'\u2011')) return pycompat.to_text(self.user_lang().format('%d', value, grouping=True).replace(r'-', u'-\N{ZERO WIDTH NO-BREAK SPACE}'))
class FloatConverter(models.AbstractModel): class FloatConverter(models.AbstractModel):
@@ -145,7 +146,7 @@ class FloatConverter(models.AbstractModel):
value = float_utils.float_round(value, precision_digits=precision) value = float_utils.float_round(value, precision_digits=precision)
fmt = '%.{precision}f'.format(precision=precision) fmt = '%.{precision}f'.format(precision=precision)
formatted = self.user_lang().format(fmt, value, grouping=True).replace(r'-', u'\u2011') formatted = self.user_lang().format(fmt, value, grouping=True).replace(r'-', u'-\N{ZERO WIDTH NO-BREAK SPACE}')
# %f does not strip trailing zeroes. %g does but its precision causes # %f does not strip trailing zeroes. %g does but its precision causes
# it to switch to scientific notation starting at a million *and* to # it to switch to scientific notation starting at a million *and* to
@@ -325,7 +326,7 @@ class MonetaryConverter(models.AbstractModel):
lang = self.user_lang() lang = self.user_lang()
formatted_amount = lang.format(fmt, display_currency.round(value), formatted_amount = lang.format(fmt, display_currency.round(value),
grouping=True, monetary=True).replace(r' ', u'\N{NO-BREAK SPACE}').replace(r'-', u'\u2011') grouping=True, monetary=True).replace(r' ', u'\N{NO-BREAK SPACE}').replace(r'-', u'-\N{ZERO WIDTH NO-BREAK SPACE}')
pre = post = u'' pre = post = u''
if display_currency.position == 'before': if display_currency.position == 'before':
@@ -367,9 +368,9 @@ class FloatTimeConverter(models.AbstractModel):
@api.model @api.model
def value_to_html(self, value, options): def value_to_html(self, value, options):
factor = -1 if value < 0 else 1 sign = math.copysign(1.0, value)
hours, minutes = divmod(abs(value) * 60, 60) hours, minutes = divmod(abs(value) * 60, 60)
return '%02d:%02d' % (hours * factor, minutes) return '%02d:%02d' % (sign * hours, minutes)
class DurationConverter(models.AbstractModel): class DurationConverter(models.AbstractModel):
@@ -73,7 +73,7 @@ class TestFloatExport(TestBasicExport):
converter = self.get_converter('float') converter = self.get_converter('float')
value = converter(-42.0) value = converter(-42.0)
self.assertEqual(value, u"\u201142.0") self.assertEqual(value, u"-\N{ZERO WIDTH NO-BREAK SPACE}42.0")
value = converter(42.0100) value = converter(42.0100)
self.assertEqual(value, "42.01") self.assertEqual(value, "42.01")
@@ -120,7 +120,7 @@ class TestCurrencyExport(TestExport):
converted = self.convert(obj, dest=currency) converted = self.convert(obj, dest=currency)
self.assertEqual( self.assertEqual(
converted, u'<span class="oe_currency_value">\u20110.12</span>' converted, u'<span class="oe_currency_value">-\N{ZERO WIDTH NO-BREAK SPACE}0.12</span>'
u'\N{NO-BREAK SPACE}{symbol}'.format( u'\N{NO-BREAK SPACE}{symbol}'.format(
obj=obj, obj=obj,
symbol=currency.symbol symbol=currency.symbol
+37 -38
View File
@@ -139,14 +139,10 @@ class TestOnChange(common.TransactionCase):
self.env.cache.invalidate() self.env.cache.invalidate()
result = self.Discussion.onchange(values, 'name', field_onchange) result = self.Discussion.onchange(values, 'name', field_onchange)
self.assertIn('messages', result['value']) self.assertIn('messages', result['value'])
self.assertItemsEqual(result['value']['messages'], [ self.assertEqual(result['value']['messages'], [
(5,), (5,),
(1, message.id, { (1, message.id, {
'name': "[%s] %s" % ("Foo", USER.name), 'name': "[%s] %s" % ("Foo", USER.name),
'body': message.body,
'author': message.author.name_get()[0],
'size': message.size,
'important': message.important,
}), }),
(0, 0, { (0, 0, {
'name': "[%s] %s" % ("Foo", USER.name), 'name': "[%s] %s" % ("Foo", USER.name),
@@ -157,6 +153,17 @@ class TestOnChange(common.TransactionCase):
}), }),
]) ])
# ensure onchange changing one2many without subfield works
one_level_fields = {k: v for k, v in field_onchange.items() if k.count('.') < 1}
values = dict(values, name='{generate_dummy_message}')
result = self.Discussion.with_context(generate_dummy_message=True).onchange(values, 'name', one_level_fields)
self.assertEqual(result['value']['messages'], [
(5,),
(4, message.id),
(0, 0, {}),
(0, 0, {}),
])
def test_onchange_one2many_reference(self): def test_onchange_one2many_reference(self):
""" test the effect of onchange() on one2many fields with line references """ """ test the effect of onchange() on one2many fields with line references """
BODY = "What a beautiful day!" BODY = "What a beautiful day!"
@@ -245,8 +252,7 @@ class TestOnChange(common.TransactionCase):
'lines': [ 'lines': [
(5,), (5,),
(1, line1.id, {'name': partner2.name, (1, line1.id, {'name': partner2.name,
'partner': (partner2.id, partner2.name), 'partner': (partner2.id, partner2.name)}),
'tags': [(5,)]}),
(0, 0, {'name': partner2.name, (0, 0, {'name': partner2.name,
'partner': (partner2.id, partner2.name), 'partner': (partner2.id, partner2.name),
'tags': [(5,)]}), 'tags': [(5,)]}),
@@ -254,6 +260,17 @@ class TestOnChange(common.TransactionCase):
}) })
# do it again, but this time with a new tag on the second line # do it again, but this time with a new tag on the second line
expected_new_tag_result = {
'name': partner2.name,
'lines': [
(5,),
(1, line1.id, {'name': partner2.name,
'partner': (partner2.id, partner2.name)}),
(0, 0, {'name': partner2.name,
'partner': (partner2.id, partner2.name),
'tags': [(5,), (0, 0, {'name': 'Tag'})]}),
],
}
values = { values = {
'name': partner1.name, 'name': partner1.name,
'partner': partner2.id, # this one just changed 'partner': partner2.id, # this one just changed
@@ -265,18 +282,13 @@ class TestOnChange(common.TransactionCase):
self.env.cache.invalidate() self.env.cache.invalidate()
result = multi.onchange(values, 'partner', field_onchange) result = multi.onchange(values, 'partner', field_onchange)
self.assertEqual(result['value'], { self.assertEqual(result['value'], expected_new_tag_result)
'name': partner2.name,
'lines': [ # ensure ID is not returned when asked and a many2many record is set to be created
(5,), self.env.cache.invalidate()
(1, line1.id, {'name': partner2.name,
'partner': (partner2.id, partner2.name), result = multi.onchange(values, 'partner', dict(field_onchange, **{'lines.tags.id': None}))
'tags': [(5,)]}), self.assertEqual(result['value'], expected_new_tag_result)
(0, 0, {'name': partner2.name,
'partner': (partner2.id, partner2.name),
'tags': [(5,), (0, 0, {'name': 'Tag'})]}),
],
})
def test_onchange_specific(self): def test_onchange_specific(self):
""" test the effect of field-specific onchange method """ """ test the effect of field-specific onchange method """
@@ -308,8 +320,7 @@ class TestOnChange(common.TransactionCase):
self.assertIn('participants', result['value']) self.assertIn('participants', result['value'])
self.assertItemsEqual( self.assertItemsEqual(
result['value']['participants'], result['value']['participants'],
[(5,)] + [(1, user.id, {'display_name': user.display_name}) [(5,)] + [(4, user.id) for user in discussion.participants + demo],
for user in discussion.participants + demo],
) )
def test_onchange_default(self): def test_onchange_default(self):
@@ -345,6 +356,8 @@ class TestOnChange(common.TransactionCase):
self.assertEqual(len(discussion.messages), 3) self.assertEqual(len(discussion.messages), 3)
messages = [(4, msg.id) for msg in discussion.messages] messages = [(4, msg.id) for msg in discussion.messages]
messages[0] = (1, messages[0][1], {'body': 'test onchange'}) messages[0] = (1, messages[0][1], {'body': 'test onchange'})
lines = ["%s:%s" % (m.name, m.body) for m in discussion.messages]
lines[0] = "%s:%s" % (discussion.messages[0].name, 'test onchange')
values = { values = {
'name': discussion.name, 'name': discussion.name,
'moderator': demo.id, 'moderator': demo.id,
@@ -355,8 +368,7 @@ class TestOnChange(common.TransactionCase):
} }
result = discussion.onchange(values, 'messages', field_onchange) result = discussion.onchange(values, 'messages', field_onchange)
self.assertIn('message_concat', result['value']) self.assertIn('message_concat', result['value'])
self.assertEqual(result['value']['message_concat'], self.assertEqual(result['value']['message_concat'], "\n".join(lines))
"\n".join(["%s:%s" % (m.name, m.body) for m in discussion.messages]))
def test_onchange_one2many_with_domain_on_related_field(self): def test_onchange_one2many_with_domain_on_related_field(self):
""" test the value of the one2many field when defined with a domain on a related field""" """ test the value of the one2many field when defined with a domain on a related field"""
@@ -402,28 +414,15 @@ class TestOnChange(common.TransactionCase):
'categories': [(4, cat.id) for cat in discussion.categories], 'categories': [(4, cat.id) for cat in discussion.categories],
'messages': [(4, msg.id) for msg in discussion.messages], 'messages': [(4, msg.id) for msg in discussion.messages],
'participants': [(4, usr.id) for usr in discussion.participants], 'participants': [(4, usr.id) for usr in discussion.participants],
'message_changes': 0,
'important_messages': [(4, msg.id) for msg in discussion.important_messages], 'important_messages': [(4, msg.id) for msg in discussion.important_messages],
'important_emails': [(4, eml.id) for eml in discussion.important_emails], 'important_emails': [(4, eml.id) for eml in discussion.important_emails],
} }
self.env.cache.invalidate()
result = discussion.onchange(values, 'name', field_onchange) result = discussion.onchange(values, 'name', field_onchange)
# When one2many domain contains non-computed field, things are ok
self.assertEqual(result['value']['important_messages'],
[(5,)] + [(4, msg.id) for msg in discussion.important_messages])
# But here with commit 5676d81, we get value of: [(2, email.id)]
self.assertEqual( self.assertEqual(
result['value']['important_emails'], result['value']['important_emails'],
[(5,), [(5,), (1, email.id, {'name': u'[Foo Bar] %s' % USER.name})],
(1, email.id, {
'name': u'[Foo Bar] %s' % USER.name,
'body': email.body,
'author': USER.name_get()[0],
'important': True,
'email_to': demo.email,
'size': email.size,
})]
) )
def test_onchange_related(self): def test_onchange_related(self):
+106 -29
View File
@@ -4972,28 +4972,114 @@ class BaseModel(MetaModel('DummyModel', (object,), {'_register': False})):
if not all(name in self._fields for name in names): if not all(name in self._fields for name in names):
return {} return {}
# filter out keys in field_onchange that do not refer to actual fields class PrefixTree(OrderedDict):
dotnames = [] """ A prefix tree for sequences of field names. The tree is a
for dotname in field_onchange: dictionary that associates each given field name to its
try: corresponding subtree (in fields order)::
model = self.browse()
for name in dotname.split('.'): # tree corresponding to dotnames
model = model[name] # ['name', 'line_ids.product_id', 'line_ids.tags_ids.name']
dotnames.append(dotname) {
except Exception: 'name': {},
pass 'line_ids': {
'product_id': {},
'tags_ids': {
'name': {},
},
},
}
"""
def __init__(self, model, dotnames):
super(PrefixTree, self).__init__()
if not dotnames:
return
# group dotnames by prefix
suffixes = defaultdict(list)
for dotname in dotnames:
names = dotname.split('.', 1)
name_suffixes = suffixes[names[0]]
if len(names) > 1:
name_suffixes.append(names[1])
# fill in self in fields order
for name in model._fields:
if name in suffixes:
self[name] = PrefixTree(model[name], suffixes[name])
def dotnames(self):
""" Iterate over the sequences of field names. """
for name, subnames in self.items():
yield name
for dotname in subnames.dotnames():
yield "%s.%s" % (name, dotname)
nametree = PrefixTree(self.browse(), field_onchange)
dotnames = list(nametree.dotnames())
def snapshot(record, tree=nametree):
""" Return a dict with the values of record, following nametree. """
vals = {}
for name, subnames in tree.items():
if subnames:
# x2many fields as {line: snapshot(line), ...}
vals[name] = OrderedDict(
(line, snapshot(line, subnames))
for line in record[name]
)
else:
vals[name] = record[name]
return vals
def diff(record, old, new, tree=nametree):
""" Return the values that differ between snapshots.
The snapshot ``old`` may be empty (for new records).
"""
result = {}
for name, subnames in tree.items():
if name == 'id':
continue
if old and old[name] == new[name]:
continue
field = record._fields[name]
if not subnames:
result[name] = field.convert_to_onchange(new[name], record, {})
continue
# x2many fields: serialize value as commands
result[name] = commands = [(5,)]
old_val = old.get(name) or {}
for line, vals in new[name].items():
vals0 = (old_val.get(line) or snapshot(line, subnames)) if line.id else {}
line_diff = diff(line, vals0, vals, subnames)
if not line.id:
commands.append((0, line.id.ref or 0, line_diff))
elif line_diff:
commands.append((1, line.id, line_diff))
else:
commands.append((4, line.id))
return result
# prefetch x2many lines without data (for the initial snapshot)
for name, subnames in nametree.items():
if subnames and values.get(name):
# retrieve all ids in commands, and read the expected fields
line_ids = []
for cmd in values[name]:
if cmd[0] in (1, 4):
line_ids.append(cmd[1])
elif cmd[0] == 6:
line_ids.extend(cmd[2])
lines = self.browse()[name].browse(line_ids)
lines.read(list(subnames), load='_classic_write')
# create a new record with values, and attach ``self`` to it # create a new record with values, and attach ``self`` to it
with env.do_in_onchange(): with env.do_in_onchange():
record = self.new(values) record = self.new(values)
values = {name: record[name] for name in record._cache} values = {name: record[name] for name in nametree}
# attach ``self`` with a different context (for cache consistency) # attach ``self`` with a different context (for cache consistency)
record._origin = self.with_context(__onchange=True) record._origin = self.with_context(__onchange=True)
# load fields on secondary records, to avoid false changes # make a snapshot based on the initial values of record
with env.do_in_onchange(): with env.do_in_onchange():
for dotname in dotnames: before = snapshot(record)
record.mapped(dotname)
# determine which field(s) should be triggered an onchange # determine which field(s) should be triggered an onchange
todo = list(names) or list(values) todo = list(names) or list(values)
@@ -5012,7 +5098,6 @@ class BaseModel(MetaModel('DummyModel', (object,), {'_register': False})):
record[name] = value record[name] = value
result = {} result = {}
dirty = set()
# process names in order (or the keys of values if no name given) # process names in order (or the keys of values if no name given)
while todo: while todo:
@@ -5038,22 +5123,14 @@ class BaseModel(MetaModel('DummyModel', (object,), {'_register': False})):
field.type in ('one2many', 'many2many') and newval._is_dirty() field.type in ('one2many', 'many2many') and newval._is_dirty()
): ):
todo.append(name) todo.append(name)
dirty.add(name)
# determine subfields for field.convert_to_onchange() below # make a snapshot based on the final values of record
Tree = lambda: defaultdict(Tree)
subnames = Tree()
for dotname in dotnames:
subtree = subnames
for name in dotname.split('.'):
subtree = subtree[name]
# collect values from dirty fields
with env.do_in_onchange(): with env.do_in_onchange():
result['value'] = { after = snapshot(record)
name: self._fields[name].convert_to_onchange(record[name], record, subnames[name])
for name in dirty # determine values that have changed by comparing snapshots
} self.invalidate_cache()
result['value'] = diff(record, before, after)
return result return result
+1 -1
View File
@@ -131,7 +131,7 @@ class FSWatcher(object):
if isinstance(event, (FileCreatedEvent, FileModifiedEvent, FileMovedEvent)): if isinstance(event, (FileCreatedEvent, FileModifiedEvent, FileMovedEvent)):
if not event.is_directory: if not event.is_directory:
path = getattr(event, 'dest_path', event.src_path) path = getattr(event, 'dest_path', event.src_path)
if path.endswith('.py'): if path.endswith('.py') and not os.path.basename(path).startswith('.~'):
try: try:
source = open(path, 'rb').read() + b'\n' source = open(path, 'rb').read() + b'\n'
compile(source, path, 'exec') compile(source, path, 'exec')
+2 -2
View File
@@ -107,8 +107,8 @@ _SAFE_OPCODES = _EXPR_OPCODES.union(set(opmap[x] for x in [
'JUMP_FORWARD', 'JUMP_IF_TRUE', 'JUMP_IF_FALSE', 'JUMP_ABSOLUTE', 'JUMP_FORWARD', 'JUMP_IF_TRUE', 'JUMP_IF_FALSE', 'JUMP_ABSOLUTE',
# New in Python 2.7 - http://bugs.python.org/issue4715 : # New in Python 2.7 - http://bugs.python.org/issue4715 :
'JUMP_IF_FALSE_OR_POP', 'JUMP_IF_TRUE_OR_POP', 'POP_JUMP_IF_FALSE', 'JUMP_IF_FALSE_OR_POP', 'JUMP_IF_TRUE_OR_POP', 'POP_JUMP_IF_FALSE',
'POP_JUMP_IF_TRUE', 'SETUP_EXCEPT', 'END_FINALLY', 'RAISE_VARARGS', 'POP_JUMP_IF_TRUE', 'SETUP_EXCEPT', 'SETUP_FINALLY', 'END_FINALLY',
'LOAD_NAME', 'STORE_NAME', 'DELETE_NAME', 'LOAD_ATTR', 'RAISE_VARARGS', 'LOAD_NAME', 'STORE_NAME', 'DELETE_NAME', 'LOAD_ATTR',
'LOAD_FAST', 'STORE_FAST', 'DELETE_FAST', 'UNPACK_SEQUENCE', 'LOAD_FAST', 'STORE_FAST', 'DELETE_FAST', 'UNPACK_SEQUENCE',
'LOAD_GLOBAL', # Only allows access to restricted globals 'LOAD_GLOBAL', # Only allows access to restricted globals
] if x in opmap)) ] if x in opmap))