| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- from django import forms
- from .models import Dividendo, Divisa, Operacion, Valor
- class BootstrapFormMixin:
- """Aplica la clase form-control de Bootstrap a todos los campos."""
- def __init__(self, *args, **kwargs):
- super().__init__(*args, **kwargs)
- for field in self.fields.values():
- css = field.widget.attrs.get('class', '')
- field.widget.attrs['class'] = f'{css} form-control'.strip()
- class ValorChoiceField(forms.ModelChoiceField):
- """Muestra la moneda de cada valor en el desplegable."""
- def label_from_instance(self, obj):
- return f'{obj.ticker} - {obj.nombre} [{obj.divisa.codigo}]'
- class ValorForm(BootstrapFormMixin, forms.ModelForm):
- class Meta:
- model = Valor
- fields = ['ticker', 'nombre', 'divisa', 'mercado', 'isin']
- def __init__(self, *args, **kwargs):
- super().__init__(*args, **kwargs)
- self.fields['ticker'].widget.attrs['placeholder'] = 'p. ej. SAN.MC'
- if not Divisa.objects.exists():
- self.fields['divisa'].empty_label = None
- class OperacionForm(BootstrapFormMixin, forms.ModelForm):
- valor = ValorChoiceField(queryset=Valor.objects.select_related('divisa'))
- class Meta:
- model = Operacion
- fields = ['valor', 'tipo', 'fecha', 'cantidad', 'precio', 'comisiones']
- widgets = {
- # formato ISO: imprescindible para que <input type="date">
- # muestre la fecha existente al editar
- 'fecha': forms.DateInput(attrs={'type': 'date'}, format='%Y-%m-%d'),
- }
- help_texts = {
- 'valor': 'El importe se registra en la moneda indicada entre corchetes.',
- }
- class DividendoForm(BootstrapFormMixin, forms.ModelForm):
- valor = ValorChoiceField(queryset=Valor.objects.select_related('divisa'))
- class Meta:
- model = Dividendo
- fields = ['valor', 'fecha', 'bruto', 'retencion']
- widgets = {
- 'fecha': forms.DateInput(attrs={'type': 'date'}, format='%Y-%m-%d'),
- }
- help_texts = {
- 'valor': 'Los importes se registran en la moneda indicada entre corchetes.',
- }
- class DivisaForm(BootstrapFormMixin, forms.ModelForm):
- class Meta:
- model = Divisa
- fields = ['codigo', 'nombre', 'cambio_eur']
- def __init__(self, *args, **kwargs):
- super().__init__(*args, **kwargs)
- self.fields['codigo'].widget.attrs['placeholder'] = 'p. ej. USD'
- self.fields['codigo'].widget.attrs['style'] = 'text-transform: uppercase'
- def clean_codigo(self):
- return self.cleaned_data['codigo'].upper()
|