forms.py 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. from django import forms
  2. from .models import Dividendo, Divisa, Operacion, Valor
  3. class BootstrapFormMixin:
  4. """Aplica la clase form-control de Bootstrap a todos los campos."""
  5. def __init__(self, *args, **kwargs):
  6. super().__init__(*args, **kwargs)
  7. for field in self.fields.values():
  8. css = field.widget.attrs.get('class', '')
  9. field.widget.attrs['class'] = f'{css} form-control'.strip()
  10. class ValorChoiceField(forms.ModelChoiceField):
  11. """Muestra la moneda de cada valor en el desplegable."""
  12. def label_from_instance(self, obj):
  13. return f'{obj.ticker} - {obj.nombre} [{obj.divisa.codigo}]'
  14. class ValorForm(BootstrapFormMixin, forms.ModelForm):
  15. class Meta:
  16. model = Valor
  17. fields = ['ticker', 'nombre', 'divisa', 'mercado', 'isin']
  18. def __init__(self, *args, **kwargs):
  19. super().__init__(*args, **kwargs)
  20. self.fields['ticker'].widget.attrs['placeholder'] = 'p. ej. SAN.MC'
  21. if not Divisa.objects.exists():
  22. self.fields['divisa'].empty_label = None
  23. class OperacionForm(BootstrapFormMixin, forms.ModelForm):
  24. valor = ValorChoiceField(queryset=Valor.objects.select_related('divisa'))
  25. class Meta:
  26. model = Operacion
  27. fields = ['valor', 'tipo', 'fecha', 'cantidad', 'precio', 'comisiones']
  28. widgets = {
  29. # formato ISO: imprescindible para que <input type="date">
  30. # muestre la fecha existente al editar
  31. 'fecha': forms.DateInput(attrs={'type': 'date'}, format='%Y-%m-%d'),
  32. }
  33. help_texts = {
  34. 'valor': 'El importe se registra en la moneda indicada entre corchetes.',
  35. }
  36. class DividendoForm(BootstrapFormMixin, forms.ModelForm):
  37. valor = ValorChoiceField(queryset=Valor.objects.select_related('divisa'))
  38. class Meta:
  39. model = Dividendo
  40. fields = ['valor', 'fecha', 'bruto', 'retencion']
  41. widgets = {
  42. 'fecha': forms.DateInput(attrs={'type': 'date'}, format='%Y-%m-%d'),
  43. }
  44. help_texts = {
  45. 'valor': 'Los importes se registran en la moneda indicada entre corchetes.',
  46. }
  47. class DivisaForm(BootstrapFormMixin, forms.ModelForm):
  48. class Meta:
  49. model = Divisa
  50. fields = ['codigo', 'nombre', 'cambio_eur']
  51. def __init__(self, *args, **kwargs):
  52. super().__init__(*args, **kwargs)
  53. self.fields['codigo'].widget.attrs['placeholder'] = 'p. ej. USD'
  54. self.fields['codigo'].widget.attrs['style'] = 'text-transform: uppercase'
  55. def clean_codigo(self):
  56. return self.cleaned_data['codigo'].upper()