diff --git a/recruitment/forms.py b/recruitment/forms.py index 5702b1f..2457534 100644 --- a/recruitment/forms.py +++ b/recruitment/forms.py @@ -1588,6 +1588,9 @@ class MessageForm(forms.ModelForm): # Validate messaging permissions if self.user and cleaned_data.get("recipient"): self._validate_messaging_permissions(cleaned_data) + + if self.cleaned_data.get('recipient')==self.user: + raise forms.ValidationError(_("You cannot message yourself")) return cleaned_data @@ -2015,8 +2018,13 @@ class SettingsForm(forms.ModelForm): class Meta: model = Settings - fields = ['key', 'value'] + fields = ['name','key', 'value'] widgets = { + 'name': forms.TextInput(attrs={ + 'class': 'form-control mb-3', + 'placeholder': 'e.g., Zoom', + 'required': True + }), 'key': forms.TextInput(attrs={ 'class': 'form-control', 'placeholder': 'Enter setting key', diff --git a/recruitment/migrations/0004_settings_name.py b/recruitment/migrations/0004_settings_name.py new file mode 100644 index 0000000..c5c7f1f --- /dev/null +++ b/recruitment/migrations/0004_settings_name.py @@ -0,0 +1,18 @@ +# Generated by Django 5.2.7 on 2025-12-15 14:48 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('recruitment', '0003_interview_interview_result_interview_result_comments'), + ] + + operations = [ + migrations.AddField( + model_name='settings', + name='name', + field=models.CharField(blank=True, help_text="A human-readable name (e.g., 'Zoom')", max_length=100, null=True, verbose_name='Friendly Name'), + ), + ] diff --git a/recruitment/models.py b/recruitment/models.py index 8564211..0598ef1 100644 --- a/recruitment/models.py +++ b/recruitment/models.py @@ -2593,6 +2593,12 @@ class Document(Base): class Settings(Base): """Model to store key-value pair settings""" + name = models.CharField( + max_length=100, + verbose_name=_("Friendly Name"), + help_text=_("A human-readable name (e.g., 'Zoom')"), + null=True, blank=True + ) key = models.CharField( max_length=100, @@ -2604,6 +2610,7 @@ class Settings(Base): verbose_name=_("Setting Value"), help_text=_("Value for the setting"), ) + class Meta: verbose_name = _("Setting") diff --git a/recruitment/utils.py b/recruitment/utils.py index 43933cc..8acff87 100644 --- a/recruitment/utils.py +++ b/recruitment/utils.py @@ -51,7 +51,7 @@ def get_setting(key, default=None): return default -def set_setting(key, value): +def set_setting(key, value,name): """ Set a setting value in the database @@ -62,8 +62,9 @@ def set_setting(key, value): Returns: Settings: The created or updated setting object """ + print(key,value) setting, created = Settings.objects.update_or_create( - key=key, defaults={"value": str(value)} + key=key, value=value,name=name ) return setting @@ -262,26 +263,35 @@ def initialize_default_settings(): """ # Zoom settings zoom_settings = { - "ZOOM_ACCOUNT_ID": getattr(settings, "ZOOM_ACCOUNT_ID", ""), - "ZOOM_CLIENT_ID": getattr(settings, "ZOOM_CLIENT_ID", ""), - "ZOOM_CLIENT_SECRET": getattr(settings, "ZOOM_CLIENT_SECRET", ""), - "ZOOM_WEBHOOK_API_KEY": getattr(settings, "ZOOM_WEBHOOK_API_KEY", ""), - "SECRET_TOKEN": getattr(settings, "SECRET_TOKEN", ""), + "ZOOM_ACCOUNT_ID": "", + "ZOOM_CLIENT_ID": "", + "ZOOM_CLIENT_SECRET": "", + "ZOOM_WEBHOOK_API_KEY": "", + "SECRET_TOKEN": "", } # LinkedIn settings linkedin_settings = { - "LINKEDIN_CLIENT_ID": getattr(settings, "LINKEDIN_CLIENT_ID", ""), - "LINKEDIN_CLIENT_SECRET": getattr(settings, "LINKEDIN_CLIENT_SECRET", ""), - "LINKEDIN_REDIRECT_URI": getattr(settings, "LINKEDIN_REDIRECT_URI", ""), + "LINKEDIN_CLIENT_ID": "", + "LINKEDIN_CLIENT_SECRET": "", + "LINKEDIN_REDIRECT_URI": "", } - # Create settings if they don't exist - all_settings = {**zoom_settings, **linkedin_settings} + openrouter_settings = { + "OPENROUTER_API_URL":"", + "OPENROUTER_API_KEY":"", + "OPENROUTER_MODEL":"" + } + + + # Create settings if they don't exist + all_settings = {**zoom_settings, **linkedin_settings,**openrouter_settings} + names=['ZOOM','ZOOM','ZOOM','ZOOM','ZOOM','LINKEDIN','LINKEDIN','LINKEDIN','OPENROUTER','OPENROUTER','OPENROUTER'] + i=0 for key, value in all_settings.items(): - if value: # Only set if value exists - set_setting(key, value) + set_setting(key, value,names[i]) + i=i+1 ##################################### diff --git a/recruitment/views.py b/recruitment/views.py index bfa2d13..d133771 100644 --- a/recruitment/views.py +++ b/recruitment/views.py @@ -4290,12 +4290,10 @@ def update_interview_result(request,slug): form = InterviewResultForm(request.POST, instance=interview) if form.is_valid(): - - interview.save(update_fields=['interview_result', 'result_comments']) - + form.save() # Saves form data - messages.success(request, _("Interview cancelled successfully.")) + messages.success(request, _(f"Interview result updated successfully to {interview.interview_result}.")) return redirect("interview_detail", slug=schedule.slug) else: error_list = [ diff --git a/templates/interviews/interview_detail.html b/templates/interviews/interview_detail.html index 00f14dc..7383fb3 100644 --- a/templates/interviews/interview_detail.html +++ b/templates/interviews/interview_detail.html @@ -523,11 +523,34 @@ {% if schedule.status == 'completed' %} - +
{{ setting.name|default:setting.key }}
+{{ setting.key }}
+
+