Release 2.43 (#5694)

This commit is contained in:
Kevin Papst
2025-11-14 17:41:33 +01:00
committed by GitHub
parent 8e6764b67a
commit 8a42c9640f
22 changed files with 319 additions and 118 deletions

View File

@@ -36,7 +36,6 @@ use Symfony\Component\Security\Http\Attribute\IsGranted;
final class ActivityController extends BaseApiController
{
public const GROUPS_ENTITY = ['Default', 'Entity', 'Activity', 'Activity_Entity'];
public const GROUPS_FORM = ['Default', 'Entity', 'Activity'];
public const GROUPS_COLLECTION = ['Default', 'Collection', 'Activity'];
public const GROUPS_RATE = ['Default', 'Entity', 'Activity_Rate'];
@@ -130,8 +129,7 @@ final class ActivityController extends BaseApiController
throw $this->createAccessDeniedException('User cannot create activities');
}
$activity = new Activity();
$this->activityService->loadMetaFields($activity);
$activity = $this->activityService->createNewActivity();
$form = $this->createForm(ActivityApiEditForm::class, $activity, [
'include_budget' => $this->isGranted('budget', $activity),
@@ -150,7 +148,7 @@ final class ActivityController extends BaseApiController
}
$view = new View($form);
$view->getContext()->setGroups(self::GROUPS_FORM);
$view->getContext()->setGroups(self::GROUPS_ENTITY);
return $this->viewHandler->handle($view);
}
@@ -177,7 +175,7 @@ final class ActivityController extends BaseApiController
if (false === $form->isValid()) {
$view = new View($form, Response::HTTP_OK);
$view->getContext()->setGroups(self::GROUPS_FORM);
$view->getContext()->setGroups(self::GROUPS_ENTITY);
return $this->viewHandler->handle($view);
}

View File

@@ -36,7 +36,6 @@ use Symfony\Component\Security\Http\Attribute\IsGranted;
final class CustomerController extends BaseApiController
{
public const GROUPS_ENTITY = ['Default', 'Entity', 'Customer', 'Customer_Entity'];
public const GROUPS_FORM = ['Default', 'Entity', 'Customer'];
public const GROUPS_COLLECTION = ['Default', 'Collection', 'Customer'];
public const GROUPS_RATE = ['Default', 'Entity', 'Customer_Rate'];
@@ -139,7 +138,7 @@ final class CustomerController extends BaseApiController
}
$view = new View($form);
$view->getContext()->setGroups(self::GROUPS_FORM);
$view->getContext()->setGroups(self::GROUPS_ENTITY);
return $this->viewHandler->handle($view);
}
@@ -166,7 +165,7 @@ final class CustomerController extends BaseApiController
if (false === $form->isValid()) {
$view = new View($form, Response::HTTP_OK);
$view->getContext()->setGroups(self::GROUPS_FORM);
$view->getContext()->setGroups(self::GROUPS_ENTITY);
return $this->viewHandler->handle($view);
}

View File

@@ -38,7 +38,6 @@ use Symfony\Component\Validator\Constraints;
final class ProjectController extends BaseApiController
{
public const GROUPS_ENTITY = ['Default', 'Entity', 'Project', 'Project_Entity'];
public const GROUPS_FORM = ['Default', 'Entity', 'Project'];
public const GROUPS_COLLECTION = ['Default', 'Collection', 'Project'];
public const GROUPS_RATE = ['Default', 'Entity', 'Project_Rate'];
@@ -194,7 +193,7 @@ final class ProjectController extends BaseApiController
}
$view = new View($form);
$view->getContext()->setGroups(self::GROUPS_FORM);
$view->getContext()->setGroups(self::GROUPS_ENTITY);
return $this->viewHandler->handle($view);
}
@@ -223,7 +222,7 @@ final class ProjectController extends BaseApiController
if (false === $form->isValid()) {
$view = new View($form, Response::HTTP_OK);
$view->getContext()->setGroups(self::GROUPS_FORM);
$view->getContext()->setGroups(self::GROUPS_ENTITY);
return $this->viewHandler->handle($view);
}

View File

@@ -100,7 +100,7 @@ final class ResetTestCommand extends AbstractResetCommand
$user2->setAvatar('https://www.gravatar.com/avatar/00000000000000000000000000000000?d=retro&f=y');
$user2->setEnabled(true);
$user2->setRoles(['ROLE_USER']);
$user2->setUserIdentifier('john_user');
$user2->setUserIdentifier(UserFixtures::USERNAME_USER);
$user2->setEmail('john_user@example.com');
$token2 = new AccessToken($user2, UserFixtures::DEFAULT_API_TOKEN . '_user');
$token2->setName('Test fixture');
@@ -118,41 +118,41 @@ final class ResetTestCommand extends AbstractResetCommand
$token3 = new AccessToken($user3, UserFixtures::DEFAULT_API_TOKEN . '_inactive');
$token3->setName('Test fixture');
$user4 = new User();
$user4->setPreferenceValue(UserPreference::HOURLY_RATE, 35);
$user4->setAlias('Tony Maier');
$user4->setRegisteredAt(new \DateTime('2018-02-06 23:28:57'));
$user4->setTitle('Head of Development');
$user4->setAvatar('https://en.gravatar.com/userimage/3533186/bf2163b1dd23f3107a028af0195624e9.jpeg');
$user4->setEnabled(true);
$user4->setRoles(['ROLE_TEAMLEAD']);
$user4->setUserIdentifier('tony_teamlead');
$user4->setEmail('tony_teamlead@example.com');
$token4 = new AccessToken($user4, UserFixtures::DEFAULT_API_TOKEN . '_teamlead');
$userTeamlead = new User();
$userTeamlead->setPreferenceValue(UserPreference::HOURLY_RATE, 35);
$userTeamlead->setAlias('Tony Maier');
$userTeamlead->setRegisteredAt(new \DateTime('2018-02-06 23:28:57'));
$userTeamlead->setTitle('Head of Development');
$userTeamlead->setAvatar('https://en.gravatar.com/userimage/3533186/bf2163b1dd23f3107a028af0195624e9.jpeg');
$userTeamlead->setEnabled(true);
$userTeamlead->setRoles(['ROLE_TEAMLEAD']);
$userTeamlead->setUserIdentifier(UserFixtures::USERNAME_TEAMLEAD);
$userTeamlead->setEmail('tony_teamlead@example.com');
$token4 = new AccessToken($userTeamlead, UserFixtures::DEFAULT_API_TOKEN . '_teamlead');
$token4->setName('Test fixture');
$user5 = new User();
$user5->setPreferenceValue(UserPreference::HOURLY_RATE, 81);
$user5->setAlias('Anna Smith');
$user5->setRegisteredAt(new \DateTime('2018-02-06 23:28:57'));
$user5->setTitle('Administrator');
$user5->setEnabled(true);
$user5->setRoles(['ROLE_ADMIN']);
$user5->setUserIdentifier('anna_admin');
$user5->setEmail('anna_admin@example.com');
$token5 = new AccessToken($user5, UserFixtures::DEFAULT_API_TOKEN . '_admin');
$userAdmin = new User();
$userAdmin->setPreferenceValue(UserPreference::HOURLY_RATE, 81);
$userAdmin->setAlias('Anna Smith');
$userAdmin->setRegisteredAt(new \DateTime('2018-02-06 23:28:57'));
$userAdmin->setTitle('Administrator');
$userAdmin->setEnabled(true);
$userAdmin->setRoles(['ROLE_ADMIN']);
$userAdmin->setUserIdentifier(UserFixtures::USERNAME_ADMIN);
$userAdmin->setEmail('anna_admin@example.com');
$token5 = new AccessToken($userAdmin, UserFixtures::DEFAULT_API_TOKEN . '_admin');
$token5->setName('Test fixture');
$user6 = new User();
$user6->setPreferenceValue(UserPreference::HOURLY_RATE, 46);
$user6->setRegisteredAt(new \DateTime('2018-02-06 23:28:57'));
$user6->setTitle('Super Administrator');
$user6->setAvatar('/bundles/avanzuadmintheme/img/avatar.png');
$user6->setEnabled(true);
$user6->setRoles(['ROLE_SUPER_ADMIN']);
$user6->setUserIdentifier('susan_super');
$user6->setEmail('susan_super@example.com');
$token6 = new AccessToken($user6, UserFixtures::DEFAULT_API_TOKEN . '_super');
$userSuperAdmin = new User();
$userSuperAdmin->setPreferenceValue(UserPreference::HOURLY_RATE, 46);
$userSuperAdmin->setRegisteredAt(new \DateTime('2018-02-06 23:28:57'));
$userSuperAdmin->setTitle('Super Administrator');
$userSuperAdmin->setAvatar('/bundles/avanzuadmintheme/img/avatar.png');
$userSuperAdmin->setEnabled(true);
$userSuperAdmin->setRoles(['ROLE_SUPER_ADMIN']);
$userSuperAdmin->setUserIdentifier(UserFixtures::USERNAME_SUPER_ADMIN);
$userSuperAdmin->setEmail('susan_super@example.com');
$token6 = new AccessToken($userSuperAdmin, UserFixtures::DEFAULT_API_TOKEN . '_super');
$token6->setName('Test fixture');
$user7 = new User();
@@ -180,9 +180,9 @@ final class ResetTestCommand extends AbstractResetCommand
[$user1, $token1],
[$user2, $token2],
[$user3, $token3],
[$user4, $token4],
[$user5, $token5],
[$user6, $token6],
[$userTeamlead, $token4],
[$userAdmin, $token5],
[$userSuperAdmin, $token6],
[$user7, $token7],
[$user8, $token8],
];

View File

@@ -17,11 +17,11 @@ final class Constants
/**
* The current release version
*/
public const VERSION = '2.42.0';
public const VERSION = '2.43.0';
/**
* The current release: major * 10000 + minor * 100 + patch
*/
public const VERSION_ID = 24200;
public const VERSION_ID = 24300;
/**
* The software name
*/

View File

@@ -96,7 +96,7 @@ class Customer implements EntityWithMetaFields, EntityWithBudget, CreatedAt
#[Exporter\Expose(label: 'contact')]
private ?string $contact = null;
/**
* Unstructured address, better use the fields: address_line1-3, postcode, city, country
* Unstructured address, better use the fields: addressLine1-3, postcode, city, country
*/
#[ORM\Column(name: 'address', type: Types::TEXT, nullable: true)]
#[Serializer\Expose]

View File

@@ -10,7 +10,22 @@
namespace App\Form\API;
use App\Form\ActivityEditForm;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\OptionsResolver\OptionsResolver;
final class ActivityApiEditForm extends ActivityEditForm
final class ActivityApiEditForm extends AbstractType
{
public function getParent(): string
{
return ActivityEditForm::class;
}
public function configureOptions(OptionsResolver $resolver): void
{
// overwritten, so the docs show these fields
$resolver->setDefaults([
'include_budget' => true,
'include_time' => true,
]);
}
}

View File

@@ -10,7 +10,22 @@
namespace App\Form\API;
use App\Form\CustomerEditForm;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\OptionsResolver\OptionsResolver;
final class CustomerApiEditForm extends CustomerEditForm
final class CustomerApiEditForm extends AbstractType
{
public function getParent(): string
{
return CustomerEditForm::class;
}
public function configureOptions(OptionsResolver $resolver): void
{
// overwritten, so the docs show these fields
$resolver->setDefaults([
'include_budget' => true,
'include_time' => true,
]);
}
}

View File

@@ -10,7 +10,22 @@
namespace App\Form\API;
use App\Form\ProjectEditForm;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\OptionsResolver\OptionsResolver;
final class ProjectApiEditForm extends ProjectEditForm
final class ProjectApiEditForm extends AbstractType
{
public function getParent(): string
{
return ProjectEditForm::class;
}
public function configureOptions(OptionsResolver $resolver): void
{
// overwritten, so the docs show these fields
$resolver->setDefaults([
'include_budget' => true,
'include_time' => true,
]);
}
}

View File

@@ -33,7 +33,7 @@ class CustomerEditForm extends AbstractType
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$isNew = false;
$isNew = true;
$hasAddress = false;
if (isset($options['data'])) {
@@ -54,6 +54,9 @@ class CustomerEditForm extends AbstractType
->add('number', TextType::class, [
'label' => 'number',
'required' => false,
'attr' => [
'maxlength' => 50,
],
])
->add('comment', TextareaType::class, [
'label' => 'description',
@@ -83,19 +86,19 @@ class CustomerEditForm extends AbstractType
}
$builder
->add('address_line1', TextType::class, [
->add('addressLine1', TextType::class, [
'label' => 'address',
'required' => false,
])
->add('address_line2', TextType::class, [
->add('addressLine2', TextType::class, [
'label' => false,
'required' => false,
])
->add('address_line3', TextType::class, [
->add('addressLine3', TextType::class, [
'label' => false,
'required' => false,
])
->add('postcode', TextType::class, [
->add('postCode', TextType::class, [
'label' => 'postcode',
'required' => false,
])

View File

@@ -31,6 +31,9 @@ trait EntityFormTrait
if ($showMoney) {
$builder->add('budget', MoneyType::class, [
'documentation' => [
'description' => 'The money budget',
],
'empty_data' => '0.00',
'label' => 'budget',
'required' => false,

View File

@@ -29,7 +29,7 @@ class ProjectEditForm extends AbstractType
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$customer = null;
$isNew = false;
$isNew = true;
$options['currency'] = null;
$customerOptions = [];

View File

@@ -31,6 +31,9 @@ final class BudgetType extends AbstractType
'choices' => [
'budgetType_month' => self::TYPE_MONTH,
],
'documentation' => [
'description' => 'The type of budget. Only submit if you want to use a monthly budget.',
],
]);
}