Repository: ansible-collections/community.general

Issue:
Support gitlab forking_access_level, builds_access_level and container_registry_access_level fields
### Summary

Add support for the following gitlab project fields (see [gitlab api rest](https://docs.gitlab.com/ee/api/projects.html#create-project) for detail of these fields):
- `forking_access_level`: shown as `Repository forks`  project setting in gitlab web user interface
- `builds_access_level`: shown as `Repository CI/CD` project setting in gitlab web user interface
- `container_registry_access_level`:  shown as `Container registry`  project setting in gitlab web user interface


### Issue Type

Feature Idea

### Component Name

gitlab_project

### Additional Information

Example of project creation using the new fields:

```yaml
- name: Setup gitlab project
  community.general.gitlab_project:
    api_url: https://gitlab.example.com/
    validate_certs: true
    api_username: dj-wasabi
    api_password: "MySecretPassword"
    name: my_project
    group: ansible
    builds: disabled
    container_registry: disabled
    forks: disabled
    state: present
  delegate_to: localhost
```


### Code of Conduct

- [X] I agree to follow the Ansible Code of Conduct


Discussion:
Files identified in the description:
* [`plugins/modules/gitlab_project.py`](https://github.com/ansible-collections/community.general/blob/main/plugins/modules/gitlab_project.py)

If these files are incorrect, please update the `component name` section of the description or use the `!component` bot command.

[click here for bot help](https://github.com/ansible/ansibullbot/blob/devel/ISSUE_HELP.md)
<!--- boilerplate: components_banner --->
cc @Lunik @Shaps @dj-wasabi @lgatellier @marwatk @metanovii @nejch @scodeman @sh0shin @suukit @waheedi @zanssa
[click here for bot help](https://github.com/ansible/ansibullbot/blob/devel/ISSUE_HELP.md)
<!--- boilerplate: notify --->

Resolving patch:
diff --git a/plugins/modules/gitlab_project.py b/plugins/modules/gitlab_project.py
--- a/plugins/modules/gitlab_project.py
+++ b/plugins/modules/gitlab_project.py
@@ -172,6 +172,30 @@
       - This option is only used on creation, not for updates. This is also only used if I(initialize_with_readme=true).
     type: str
     version_added: "4.2.0"
+  builds_access_level:
+    description:
+      - C(private) means that repository CI/CD is allowed only to project members.
+      - C(disabled) means that repository CI/CD is disabled.
+      - C(enabled) means that repository CI/CD is enabled.
+    type: str
+    choices: ["private", "disabled", "enabled"]
+    version_added: "6.2.0"
+  forking_access_level:
+    description:
+      - C(private) means that repository forks is allowed only to project members.
+      - C(disabled) means that repository forks are disabled.
+      - C(enabled) means that repository forks are enabled.
+    type: str
+    choices: ["private", "disabled", "enabled"]
+    version_added: "6.2.0"
+  container_registry_access_level:
+    description:
+      - C(private) means that container registry is allowed only to project members.
+      - C(disabled) means that container registry is disabled.
+      - C(enabled) means that container registry is enabled.
+    type: str
+    choices: ["private", "disabled", "enabled"]
+    version_added: "6.2.0"
 '''
 
 EXAMPLES = r'''
@@ -287,6 +311,9 @@ def create_or_update_project(self, project_name, namespace, options):
             'squash_option': options['squash_option'],
             'ci_config_path': options['ci_config_path'],
             'shared_runners_enabled': options['shared_runners_enabled'],
+            'builds_access_level': options['builds_access_level'],
+            'forking_access_level': options['forking_access_level'],
+            'container_registry_access_level': options['container_registry_access_level'],
         }
         # Because we have already call userExists in main()
         if self.project_object is None:
@@ -417,6 +444,9 @@ def main():
         ci_config_path=dict(type='str'),
         shared_runners_enabled=dict(type='bool'),
         avatar_path=dict(type='path'),
+        builds_access_level=dict(type='str', choices=['private', 'disabled', 'enabled']),
+        forking_access_level=dict(type='str', choices=['private', 'disabled', 'enabled']),
+        container_registry_access_level=dict(type='str', choices=['private', 'disabled', 'enabled']),
     ))
 
     module = AnsibleModule(
@@ -464,6 +494,9 @@ def main():
     shared_runners_enabled = module.params['shared_runners_enabled']
     avatar_path = module.params['avatar_path']
     default_branch = module.params['default_branch']
+    builds_access_level = module.params['builds_access_level']
+    forking_access_level = module.params['forking_access_level']
+    container_registry_access_level = module.params['container_registry_access_level']
 
     if default_branch and not initialize_with_readme:
         module.fail_json(msg="Param default_branch need param initialize_with_readme set to true")
@@ -533,6 +566,9 @@ def main():
             "ci_config_path": ci_config_path,
             "shared_runners_enabled": shared_runners_enabled,
             "avatar_path": avatar_path,
+            "builds_access_level": builds_access_level,
+            "forking_access_level": forking_access_level,
+            "container_registry_access_level": container_registry_access_level,
         }):
 
             module.exit_json(changed=True, msg="Successfully created or updated the project %s" % project_name, project=gitlab_project.project_object._attrs)


Test patch: