Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[#163] Update User and Food Request Models, Serializers, and Views #164

Merged
merged 33 commits into from
Jun 4, 2024

Conversation

delano
Copy link
Contributor

@delano delano commented Jun 4, 2024

Addresses #163

This update introduces significant changes across multiple files, focusing on enhancing the food request submission process, user management, and overall code structure. Key changes include:

  1. Migration Updates:

    • Renamed fields in the DeliveryRegion model.
    • Simplified the Pet model by removing redundant fields and adding JSON fields for food_details and dog_details.
    • Updated the User model to include a details JSON field and made username optional.
    • Added details JSON field to the Profile model and removed the Role model.
    • Adjusted the Branch model to include more detailed address fields and updated default values for some fields.
    • Enhanced the FoodRequest model to include a pets ManyToManyField.
  2. Serializer Enhancements:

    • Created new serializers for FoodRequest, Pet, and Profile.
    • Updated UserSerializer to handle user registration and profile creation.
    • Introduced RegisterSerializer for user registration with automatic password generation.
  3. View and API Enhancements:

    • Refactored UserViewSet to CurrentUserAPIView and RegisterUserAPIView for better user management.
    • Added FoodRequestViewSet for handling food request operations.
    • Updated API routes to include new endpoints for user registration and current user retrieval.
  4. Testing Enhancements:

    • Added new test cases for user registration, profile creation, and food request submission.
    • Refactored existing tests to align with the new model and serializer changes.
    • Introduced a custom test runner for running pytest via Django's test command.
  5. Frontend Enhancements:

    • Updated client and volunteer signup pages to use new API endpoints.
    • Improved form validation and error handling in the frontend.
    • Added navigation and feedback mechanisms for better user experience.
  6. Configuration and Documentation:

    • Updated .codiumai.toml and pyproject.toml for better test configuration and dependency management.
    • Enhanced logging and signal handling for user profile creation.
    • Updated Docker and GitHub Actions configurations for streamlined development and deployment workflows.

delano added 19 commits June 1, 2024 13:33
Signed-off-by: delano <delano@cpan.org>
This commit makes the following changes to the pet model:

- Removed the following fields: `name`, `dob`, `size`, `weight`,
`usual_food_brands`, `allergies`, `allergy_types`, and `pictures`
- Added the following new fields:
  - `pet_type` (e.g. "Dog", "Cat", etc.)
  - `pet_name`
  - `pet_dob`
  - `food_details` (a JSON field for storing pet food info)
- `dog_details` (a JSON field for storing additional dog-specific info)
- Removed the `profile` foreign key, as pets will now be directly
associated with a `FoodRequest` instead of a `Profile`

The primary goals of these changes are to:

1. Simplify the pet data model by focusing only on the essential
information needed for the food delivery service, rather than trying to
capture a comprehensive pet profile.
2. Make the pet data more flexible and extensible by using JSON fields
for food and dog details, rather than having predefined fields.
3. Directly associate pets with a specific food request, rather than
having them linked to a user profile which may have multiple requests.

These changes should reduce complexity, improve maintainability, and
provide more flexibility for future enhancements to the pet data
handling.
- Moved the FoodRequestViewSet class to a separate module `food_request.py` to improve code organization and maintainability
- This change separates the view logic from the main `__init__.py` file, making the codebase more modular and easier to navigate
- The core functionality of the FoodRequestViewSet remains unchanged, but the restructuring will facilitate future additions or modifications to the food request handling
…request serializers to dedicated package

Subject: Restructure user and request serializers for enhanced functionality

- Moved the `FoodRequestCreateSerializer` and `FoodRequestUpdateSerializer` to a new `request` package to better organize the serializers
- Added a new `RegisterSerializer` that extends the base `UserSerializer` and generates a random password for new users
- Refactored the `UserSerializer` to handle password hashing and generation of a random password for new users
- These changes improve the structure and functionality of the user and request serializer modules, making the codebase more maintainable and extensible
- Enhance the login page error handling to better differentiate between different types of errors
- Add a new flow to redirect users to the welcome/clients page when the login response indicates the user needs to create an account
- This change improves the user experience by providing more specific error messages and a clear path forward when a new account is required
…oint

The changes made in this commit have the following key objectives:

1. Disable the automatic registration of new users in the Passwordless authentication system. This is done by setting the `PASSWORDLESS_REGISTER_NEW_USERS` configuration option to `False`.

2. Add a new custom `RegisterUserAPIView` that provides an API endpoint for user registration. This endpoint allows users to register by providing the necessary information, which is then used to create a new user account. The registered user is also issued an authentication token.

These changes were made to give more control over the user registration process and to provide a dedicated API endpoint for this functionality, rather than relying solely on the automatic registration feature of the Passwordless authentication system.
Clearer field labels and responsive design.

- Update the login page to include a more specific link for the sign-up
page, directing users to the "clients" sign-up flow
- Improve the layout and field labels of the "clients" sign-up page,
making it more user-friendly and accessible
  - Add icons, placeholders, and help text to the form fields
  - Mark required fields with an asterisk
  - Make the "name" field autofocus
  - Add a footer link for users to sign up as a volunteer instead
The changes in this commit improve the user registration flow and error
handling in the application:

1. **Fetch API using $fetch instead of useFetch**: The code has been
updated to use the more modern and recommended `$fetch` function from
Nuxt.js instead of the older `useFetch`. This provides a more
streamlined and consistent API for making HTTP requests.

2. **Handle registration errors properly**: The error handling has been
enhanced to better display any validation errors returned from the API.
Specifically:
- If the API returns validation errors (e.g., for the email field),
these are now displayed to the user using the `useSnackbar` utility.
- If the API returns a 404 error (page not found), the code now
correctly throws a `createError` to trigger the Nuxt.js error handling
mechanism.

3. **Redirect to the dashboard on successful registration**: After a
successful registration, the user is now automatically redirected to the
dashboard page, providing a smoother user experience.

4. **Remove unnecessary code comments**: Some commented-out code has
been removed, as it was no longer necessary.

These changes improve the overall user experience and robustness of the
registration flow in the application.
- Refactor `User` model to remove redundant fields
- Introduce `HasDetails` mixin for models with JSON details
- Create `CurrentUserAPIView` for authenticated user access
- Add post_save signal to create `Profile` upon user creation
- Simplify `UserSerializer` and remove obsolete tests
- Update Nuxt client for new API endpoints and authentication flow

Benefits:
- Improved security by eliminating plain-text password storage
- Streamlined user model and reduced duplication
- Centralized handling of user details through model mixin
- Dedicated API endpoint for current user, restricting access to other users
- Automated profile creation upon user registration
- Modernized client integration with new authentication mechanism

Considerations:
- Ensure thorough testing of authentication and registration flows
- Update documentation and provide guidance for developers
Allows running tests via `python manage.py test` using pytest instead of the default Django test runner. This provides more flexible testing capabilities and allows using pytest features like `--reuse-db` to speed up test runs.

The changes include:

- Add `TEST_RUNNER` setting to use the new `PytestTestRunner` class
- Disable rich logging and use standard StreamHandler in tests
- Add `PytestTestRunner` class to run pytest and translate Django test options
The HasDetails abstract model mixin, used for models that require a
details JSONField, has been moved from the base.py file to the mixins.py
file. This reorganizes the model mixins into a dedicated file,
separating them from the base model classes, promoting better code
organization and maintainability.
Abstract user profile details into a dedicated serializer. This
separates profile information from core user attributes, improving code
organization and maintainability.

Additionally:

- Refactor UserSerializer to use the new ProfileSerializer
- Remove obsolete phone field from UserSerializer
- Simplify user registration by generating a random UUID as the initial
password
- Add explanatory comments on password hashing and UUID usage for
registration
The `Profile` model's `user` foreign key was changed from
`on_delete=models.DO_NOTHING` to `on_delete=models.CASCADE` to maintain
data integrity by automatically deleting associated profiles when a user
is deleted.

Additionally:

- Made `phone_number` nullable to handle scenarios where a phone number
is not provided
- Refactored `create_user_profile` signal to dynamically build params
for `Profile.objects.create`, ensuring `role` is only included if a
value is present

These changes improve data consistency, remove unused code, and make the
profile creation more robust.
The key changes made in this commit are:

1. Restructured the User model fields
   - Added `name` and `terms_agreement` fields

2. Modified the Profile model
   - Added `details`, `created`, `modified`, and `is_removed` fields
   - Made `phone_number` nullable
   - Removed `user` foreign key field (moved to the end)
- Added `user` foreign key with `CASCADE` delete behavior and related
name

3. Reorganized Branch model fields
   - Moved `ext_id`, `id`, and `display_name` fields within the model

Overall, this commit reorganizes and consolidates fields across the
User, Profile, and Branch models for better structure and clarity.
- Update `User` model to use `name` instead of `username`, `first_name`,
`last_name`
- Remove `Role` model and associated tests
- Update user registration serializer and tests
- Remove redundant tests for `Profile` model
- Add signal tests to ensure `Profile` creation on `User` creation
- Refactor food request views tests

Rationale:
- Simplify user model by consolidating name fields into single `name`
field
- Remove unused `Role` model and associated tests
- Update user registration serializer and tests to match model changes
- Remove redundant profile model tests that are no longer relevant
- Add tests for signals to ensure correct profile creation behavior
- Refactor food request views tests for better code organization and
maintainability

Considerations:
- Ensure all affected areas of the codebase are updated to use the new
`name` field
- Update any references to the removed `Role` model and associated logic
- Verify user registration and authentication flows work as expected
with the updated serializer
- Double-check that profile creation behavior is consistent across
different scenarios
@delano delano added enhancement ux User experience Tests labels Jun 4, 2024
@delano delano self-assigned this Jun 4, 2024
@delano delano linked an issue Jun 4, 2024 that may be closed by this pull request
@delano delano changed the title 163 food request submission [#163] Update User and Food Request Models, Serializers, and Views Jun 4, 2024
@delano delano marked this pull request as ready for review June 4, 2024 02:29
Copy link
Contributor

qodo-merge-pro bot commented Jun 4, 2024

PR Review 🔍

⏱️ Estimated effort to review [1-5]

4, because the PR introduces a wide range of updates across models, serializers, views, and configurations, along with new test cases and modifications to the frontend. Reviewing this PR requires a comprehensive understanding of the Django REST Framework, Django models, and Vue.js components. Additionally, the introduction of new API endpoints and changes to existing ones necessitate careful consideration of security, performance, and compatibility with the frontend.

🧪 Relevant tests

Yes

⚡ Possible issues

Possible Bug: The UserViewSet class has been replaced with CurrentUserAPIView and RegisterUserAPIView, but the frontend and tests may still reference the old UserViewSet. This could lead to broken functionality where the frontend expects to interact with user-related endpoints.

Security Concern: The PR introduces changes to authentication and user registration logic, including password handling and token generation. It's crucial to ensure that these changes do not introduce vulnerabilities, such as weak password policies or token mismanagement.

Performance Concern: The new FoodRequestViewSet and changes to models might impact the performance of the application, especially if they increase the complexity of database queries or the size of the data being processed and returned by the API.

🔒 Security concerns

Sensitive information exposure: The PR includes changes to how user passwords are handled and introduces automatic token generation for users. It's important to verify that passwords are securely hashed and that tokens are securely generated and managed to prevent unauthorized access.

apps/api/afbcore/views/users/__init__.py Show resolved Hide resolved
apps/api/afbcore/models/users/user.py Outdated Show resolved Hide resolved
apps/ui/pages/welcome/clients.vue Show resolved Hide resolved
Copy link
Contributor

qodo-merge-pro bot commented Jun 4, 2024

PR Code Suggestions ✨

CategorySuggestion                                                                                                                                    Score
Best practice
Avoid using null=True on string-based fields unless necessary

Consider setting null=True for models.CharField fields only if it is really necessary.
Having both blank=True and null=True can lead to inconsistency in how empty values are
handled. If the field is a string-based field like CharField or TextField, Django
recommends using blank=True alone. This way, Django stores empty values as empty strings
rather than NULL in the database. This suggestion applies to fields such as address_line2,
city, country, and ext_id in various models.

apps/api/afbcore/migrations/0001_initial.py [36-316]

-models.CharField(blank=True, max_length=255, null=True)
+models.CharField(blank=True, max_length=255)
 
Suggestion importance[1-10]: 7

Why:

7
Define model field choices outside the field definition

When defining model fields with choices, it's a good practice to define the choices as a
list of tuples outside the model field definition. This makes it easier to reference the
choices elsewhere in your code, for example, in forms or model methods. Apply this change
to the pet_type, delivery_type, and status fields across various models.

apps/api/afbcore/migrations/0001_initial.py [113-352]

+PET_TYPE_CHOICES = [
+    ("Cat", "Cat"),
+    ("Dog", "Dog"),
+    ("Other", "Other"),
+]
+...
 models.CharField(
-    choices=[
-        ("Cat", "Cat"),
-        ("Dog", "Dog"),
-        ("Other", "Other"),
-    ],
+    choices=PET_TYPE_CHOICES,
     max_length=255,
 )
 
Suggestion importance[1-10]: 7

Why:

7
Use default instead of null=True for boolean fields

For boolean fields like is_removed, spay_neuter_requirement, flagged, etc., consider using
models.BooleanField() without null=True. Boolean fields should not have null=True as it's
better to use the default parameter to specify the default value. This avoids the
confusion of having three possible values (True, False, or None) for what should be a
binary choice.

apps/api/afbcore/migrations/0001_initial.py [74-458]

-models.BooleanField(null=True)
+models.BooleanField(default=False)
 
Suggestion importance[1-10]: 7

Why:

7
Add related_name to pets ManyToManyField in FoodRequest model

It's recommended to add related_name attributes to ForeignKey and ManyToManyField for
better reverse query readability. For example, in the FoodRequest model, adding a
related_name to the pets field would improve ORM queries from the Pet model back to
FoodRequest.

apps/api/afbcore/models/pet.py [43]

-pets = models.ManyToManyField("Pet")
+pets = models.ManyToManyField("Pet", related_name="food_requests")
 
Suggestion importance[1-10]: 7

Why:

7
Add conditional validation for optional fields

To ensure the form's phone_number field is optional but validated when provided, consider
adding a conditional validation that checks for the presence of a value before applying
any phone number specific validation rules.

apps/ui/pages/welcome/clients.vue [19]

-const fields = ref<any>([]);
+const fields = ref<any>([
+  // Other fields remain unchanged
+  {
+    name: "phone_number",
+    type: "text",
+    label: "Phone",
+    placeholder: "Your phone number",
+    icon: "i-heroicons-phone",
+    help: "We use your phone number to coordinate deliveries. See our Privacy Notice for how we use your information (link below).",
+    required: false,
+    validate: (value) => {
+      return value ? /^\d{10}$/.test(value) : true;
+    },
+  },
+]);
 
Suggestion importance[1-10]: 7

Why:

7
Enhancement
Make UUID fields' uniqueness explicit

For the UUIDField used for the id field in various models, consider explicitly setting
unique=True to ensure database integrity and clarity of design, even though
primary_key=True inherently enforces uniqueness. This change is minor but can improve the
readability of the model definitions and make the uniqueness constraint more explicit.

apps/api/afbcore/migrations/0001_initial.py [77-320]

 models.UUIDField(
     default=uuid.uuid4,
     editable=False,
     primary_key=True,
+    unique=True,
 )
 
Suggestion importance[1-10]: 7

Why:

7
Use TextField for address fields to accommodate longer addresses

It's recommended to use specific fields for addresses, such as models.TextField for
address_verbatim and address, to accommodate the full length of addresses. However, since
these fields are already defined as CharField with a max_length=255, ensure this length is
sufficient to store the full address. If addresses might exceed this length, consider
changing to TextField without a max_length constraint for better flexibility.

apps/api/afbcore/models/users/profile.py [87]

-address = models.CharField(max_length=255, blank=True, null=True)
+address = models.TextField(blank=True, null=True)
 
Suggestion importance[1-10]: 7

Why:

7
Add a unique constraint to the username field that allows for null values

Consider adding a unique constraint to the username field that allows for null values to
ensure that null can be set for multiple records, but every non-null value is unique. This
can be achieved by using models.CharField with null=True, blank=True, unique=True, but
Django does not support this out of the box for traditional fields. A workaround is to use
a custom manager or override the save method to enforce this logic.

apps/api/afbcore/models/users/user.py [131-133]

 username = models.CharField(
-    _("username"), max_length=255, unique=True, null=True, blank=True
+    _("username"), max_length=255, null=True, blank=True
 )
+# Custom save method or manager to enforce unique non-null constraint
 
Suggestion importance[1-10]: 7

Why:

7
Add more test cases for the FoodRequestViewSet to improve coverage

To improve test coverage and ensure the API behaves correctly under different scenarios,
consider adding more test cases for the FoodRequestViewSet. These could include tests for
unauthorized access, handling of invalid data, and updating or deleting food requests by
different types of users.

apps/api/afbcore/tests/views/test__requests__view.py [16-24]

-class FoodRequestViewSetTestCase(TestCase):
+# Additional test methods here
+def test_food_request_access_unauthorized(self):
+    # Test accessing the food request without authentication
+def test_create_food_request_invalid_data(self):
+    # Test creating a food request with invalid data
+def test_update_food_request(self):
+    # Test updating a food request
+def test_delete_food_request(self):
+    # Test deleting a food request
 
Suggestion importance[1-10]: 7

Why:

7
Add a method to handle the user's full name or display name

For the User model, consider implementing a method to handle the full name or a display
name that combines available name fields. This can be useful for displaying a user's name
in various parts of the application where either the name or a combination of first_name
and last_name (if name is not available) is needed.

apps/api/afbcore/models/users/user.py [92]

 class User(UUIDModel, TimeStampedModel, HasDetails, AbstractUser):
+    def get_full_name(self):
+        if self.name:
+            return self.name
+        full_name = f"{self.first_name} {self.last_name}".strip()
+        return full_name if full_name else None
 
Suggestion importance[1-10]: 7

Why:

7
Change pet_dob field to use models.DateField

Consider using models.DateField for pet_dob instead of models.CharField to ensure that the
date of birth is stored in a format that allows for date operations and validations.

apps/api/afbcore/models/pet.py [31]

-pet_dob = models.CharField(max_length=10)  # date of birth
+pet_dob = models.DateField()  # date of birth
 
Suggestion importance[1-10]: 7

Why:

7
Use v-model for reactive form inputs

Consider using v-model for form inputs to simplify data binding and form submission. This
approach can make the form more reactive and reduce the need for manual event handling or
data assignment.

apps/ui/pages/welcome/clients.vue [17-19]

-const email = route.query.email as string;
-const fields = ref<any>([]);
+const form = ref({
+  email: route.query.email as string,
+  name: '',
+  phone_number: '',
+});
 
Suggestion importance[1-10]: 7

Why:

7
Automatically trim whitespace in user inputs

To improve user experience and accessibility, consider adding v-model.trim to
automatically trim whitespace from user inputs. This is particularly useful for email and
name fields where leading or trailing spaces can be unintentionally added by users.

apps/ui/pages/welcome/clients.vue [17]

-const email = route.query.email as string;
+const form = ref({
+  email: route.query.email as string.trim(),
+  name: ''.trim(),
+  phone_number: '',
+});
 
Suggestion importance[1-10]: 7

Why:

7
Security
Implement rate limiting on the user registration API view

To enhance security and usability, consider implementing rate limiting on the
RegisterUserAPIView to prevent brute-force attacks or abuse of the user registration
process. Django Rest Framework provides a simple way to add rate limiting using the
DEFAULT_THROTTLE_CLASSES and DEFAULT_THROTTLE_RATES settings.

apps/api/afbcore/views/users/init.py [49-52]

+from rest_framework.throttling import AnonRateThrottle
+
 class RegisterUserAPIView(CreateAPIView):
     queryset = User.objects.none()
     serializer_class = UserSerializer
     permission_classes = [permissions.AllowAny]
+    throttle_classes = [AnonRateThrottle]
 
Suggestion importance[1-10]: 7

Why:

7
Add permission checks to FoodRequestViewSet

Implement permission checks in FoodRequestViewSet to ensure that only authorized users can
create, update, or delete food requests. This is crucial for data security and integrity.

apps/api/afbcore/views/requests/food_request.py [10-11]

-# TODO: Add permissions and authentication to this viewset.
+from rest_framework.permissions import IsAuthenticated
+permission_classes = [IsAuthenticated]
 
Suggestion importance[1-10]: 7

Why:

7
Performance
Optimize uniqueness check using Django's query methods

It's recommended to use Django's built-in update_or_create method for the
is_a_truly_unique functionality to simplify the logic and potentially improve performance
by reducing the number of database queries.

apps/api/afbcore/models/users/user.py [47-57]

-try:
-    record = self.get(**{field_name: value})
-    logger.info(f"UserManager.is_a_truly_unique - record: {record.pk}")
-except User.DoesNotExist:
-    logger.info("UserManager.is_a_truly_unique - DoesNotExist")
-    is_unique = True
+is_unique = not self.filter(**{field_name: value}).exists()
+if is_unique:
+    logger.info("Value is unique.")
+else:
+    logger.info("Value is not unique.")
 
Suggestion importance[1-10]: 7

Why:

7
Maintainability
Document the rationale for PASSWORDLESS_REGISTER_NEW_USERS setting

For the PASSWORDLESS_REGISTER_NEW_USERS setting, consider documenting the rationale behind
setting it to False within your settings file or a relevant configuration guide. This
helps maintainers understand the security and user registration implications.

apps/api/afb/settings.py [267]

+# Setting PASSWORDLESS_REGISTER_NEW_USERS to False requires explicit registration before login.
 "PASSWORDLESS_REGISTER_NEW_USERS": False,
 
Suggestion importance[1-10]: 7

Why:

7
Remove commented-out code from UserSerializer

For the UserSerializer, consider removing the commented-out code related to the phone
field if it's not intended to be used. Keeping commented-out code can lead to confusion
and clutter in the codebase.

apps/api/afbcore/serializers/user/user_serializer.py [22]

-# phone = serializers.CharField(required=False, allow_blank=True)
+(Remove the commented-out line)
 
Suggestion importance[1-10]: 7

Why:

7
Abstract form validation logic for maintainability

To enhance code maintainability, consider abstracting the form validation logic into a
separate composable or utility function. This can make the code cleaner and easier to test
independently from the UI component.

apps/ui/pages/welcome/clients.vue [21-22]

-const validateEmail = (email: string) => {
-  return (/^\w+([\.-\\+]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/.test(email))
+// In a separate file, e.g., `useFormValidation.js`
+export function useEmailValidation() {
+  return (email) => (/^\w+([\.-\\+]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/.test(email));
 }
+// In your component
+const { validateEmail } = useEmailValidation();
 
Suggestion importance[1-10]: 7

Why:

7
User experience
Provide detailed error messages for better user feedback

For better error handling and user feedback, consider adding a more detailed error message
when the $fetch request fails due to reasons other than a duplicate email. This can help
users understand what went wrong and how to proceed.

apps/ui/pages/welcome/clients.vue [106-118]

 if (data && data.email) {
   snackbar.add({
     type: "error",
     text: "Please choose another email address",
   });
 } else {
-  throw createError({
-    statusCode: 404,
-    statusMessage: 'Page Not Found',
-    fatal: true
-  })
+  snackbar.add({
+    type: "error",
+    text: "An unexpected error occurred. Please try again later.",
+  });
 }
 
Suggestion importance[1-10]: 7

Why:

7

💡 Tool usage guide:

Overview:
The code suggestions tool, named improve, scans the PR code changes, and automatically generates code suggestions for improving the PR.The tool can be triggered automatically every time a new PR is opened, or can be invoked manually by commenting on a PR.

  • When commenting, to edit configurations related to the improve tool (pr_code_suggestions section), use the following template:
/improve --pr_code_suggestions.some_config1=... --pr_code_suggestions.some_config2=...
[pr_code_suggestions]
some_config1=...
some_config2=...

See the improve usage page for a comprehensive guide on using this tool.

delano added 14 commits June 3, 2024 19:31
Signed-off-by: delano <delano@cpan.org>
Signed-off-by: delano <delano@cpan.org>
Signed-off-by: delano <delano@cpan.org>
Signed-off-by: delano <delano@cpan.org>
Signed-off-by: delano <delano@cpan.org>
Signed-off-by: delano <delano@cpan.org>
Signed-off-by: delano <delano@cpan.org>
Signed-off-by: delano <delano@cpan.org>
From the Nuxt release notes:
> This will refresh your lockfile as well, and ensures that you pull in updates from other dependencies that Nuxt relies on, particularly in the unjs ecosystem.

Signed-off-by: delano <delano@cpan.org>
Signed-off-by: delano <delano@cpan.org>
Signed-off-by: delano <delano@cpan.org>
Signed-off-by: delano <delano@cpan.org>
Signed-off-by: delano <delano@cpan.org>
Signed-off-by: delano <delano@cpan.org>
Copy link
Contributor Author

@delano delano left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you 😊

apps/api/afbcore/views/users/__init__.py Show resolved Hide resolved
apps/ui/pages/welcome/clients.vue Show resolved Hide resolved
apps/api/afbcore/models/users/user.py Outdated Show resolved Hide resolved
@delano delano merged commit 1e1e789 into dev Jun 4, 2024
2 checks passed
@delano delano deleted the 163-food-request-submission branch June 4, 2024 18:00
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
Status: ✔️ Done
Development

Successfully merging this pull request may close these issues.

Food request submission
1 participant