diff --git a/src/Entity/LogSystem/AbstractLogEntry.php b/src/Entity/LogSystem/AbstractLogEntry.php index c4107bae..d7ab547b 100644 --- a/src/Entity/LogSystem/AbstractLogEntry.php +++ b/src/Entity/LogSystem/AbstractLogEntry.php @@ -129,7 +129,7 @@ abstract class AbstractLogEntry extends AbstractDBElement ]; /** @var User The user which has caused this log entry - * @ORM\ManyToOne(targetEntity="App\Entity\UserSystem\User") + * @ORM\ManyToOne(targetEntity="App\Entity\UserSystem\User", fetch="EAGER") * @ORM\JoinColumn(name="id_user", nullable=false) */ protected $user; diff --git a/src/Repository/LogEntryRepository.php b/src/Repository/LogEntryRepository.php index 27a0b4f8..9ff420fa 100644 --- a/src/Repository/LogEntryRepository.php +++ b/src/Repository/LogEntryRepository.php @@ -26,7 +26,11 @@ namespace App\Repository; use App\Entity\Base\AbstractDBElement; use App\Entity\LogSystem\AbstractLogEntry; +use App\Entity\LogSystem\ElementCreatedLogEntry; +use App\Entity\LogSystem\ElementEditedLogEntry; +use App\Entity\UserSystem\User; use Doctrine\ORM\EntityRepository; +use Doctrine\ORM\QueryBuilder; class LogEntryRepository extends EntityRepository { @@ -34,8 +38,9 @@ class LogEntryRepository extends EntityRepository { //Emulate a target element criteria by splitting it manually in the needed criterias if (isset($criteria['target']) && $criteria['target'] instanceof AbstractDBElement) { + /** @var AbstractDBElement $element */ $element = $criteria['target']; - $criteria['target_id'] = $element; + $criteria['target_id'] = $element->getID(); $criteria['target_type'] = AbstractLogEntry::targetTypeClassToID(get_class($element)); unset($criteria['target']); } @@ -93,4 +98,49 @@ class LogEntryRepository extends EntityRepository return $this->getEntityManager()->find($class, $id); } + + protected function getLastUser(AbstractDBElement $element, string $class) + { + $qb = $this->createQueryBuilder('log'); + $qb->select('log') + //->where('log INSTANCE OF App\Entity\LogSystem\ElementEditedLogEntry') + ->where('log INSTANCE OF ' . $class) + ->andWhere('log.target_type = :target_type') + ->andWhere('log.target_id = :target_id') + ->orderBy('log.timestamp', 'DESC'); + + $qb->setParameters([ + 'target_type' => AbstractLogEntry::targetTypeClassToID(get_class($element)), + 'target_id' => $element->getID() + ]); + + $query = $qb->getQuery(); + $query->setMaxResults(1); + /** @var AbstractLogEntry[] $results */ + $results = $query->execute(); + if (isset($results[0])) { + return $results[0]->getUser(); + } + return null; + } + + /** + * Returns the last user that has edited the given element. + * @param AbstractDBElement $element + * @return User|null A user object, or null if no user could be determined. + */ + public function getLastEditingUser(AbstractDBElement $element): ?User + { + return $this->getLastUser($element, ElementEditedLogEntry::class); + } + + /** + * Returns the user that has created the given element. + * @param AbstractDBElement $element + * @return User|null A user object, or null if no user could be determined. + */ + public function getCreatingUser(AbstractDBElement $element): ?User + { + return $this->getLastUser($element, ElementCreatedLogEntry::class); + } } diff --git a/src/Twig/LastUserExtension.php b/src/Twig/LastUserExtension.php new file mode 100644 index 00000000..9aa3fa1e --- /dev/null +++ b/src/Twig/LastUserExtension.php @@ -0,0 +1,49 @@ +em = $em; + $this->repo = $em->getRepository(AbstractLogEntry::class); + } + + public function getFunctions() + { + return [ + new TwigFunction('getLastEditingUser', [$this->repo, 'getLastEditingUser']), + new TwigFunction('getCreatingUser', [$this->repo, 'getCreatingUser']) + ]; + } +} \ No newline at end of file diff --git a/templates/AdminPages/_info.html.twig b/templates/AdminPages/_info.html.twig index acae0ae0..a6b01460 100644 --- a/templates/AdminPages/_info.html.twig +++ b/templates/AdminPages/_info.html.twig @@ -1,3 +1,5 @@ +{% import "helper.twig" as helper %} +
@@ -10,8 +12,8 @@

- {% if date(entity.addedDate) > date('1900/01/01') %} - {{ entity.addedDate | format_datetime("long") }} + {% if entity.id is not null and date(entity.addedDate) > date('1900/01/01') %} + {{ helper.date_user_combination(entity, false, "long") }} {% else %} - {% endif %} @@ -23,8 +25,8 @@

- {% if date(entity.lastModified) > date('1900/01/01') %} - {{ entity.lastModified | format_datetime("long") }} + {% if entity.id is not null and date(entity.lastModified) > date('1900/01/01') %} + {{ helper.date_user_combination(entity, true, "long") }} {% else %} - {% endif %} diff --git a/templates/Parts/info/_extended_infos.html.twig b/templates/Parts/info/_extended_infos.html.twig index d84552c5..5f4889f0 100644 --- a/templates/Parts/info/_extended_infos.html.twig +++ b/templates/Parts/info/_extended_infos.html.twig @@ -7,11 +7,31 @@ {{ part.addedDate | format_datetime("long")}} + + {% trans %}user.creating_user{% endtrans %} + {% if is_granted('show_users', part) %} + {{ getCreatingUser(part).fullName(true) ?? 'Unknown'|trans }} + {% else %} + {% trans %}accessDenied{% endtrans %} + {% endif %} + + + {# Last modified date #} {% trans %}lastModified{% endtrans %} {{ part.lastModified | format_datetime("long")}} + + {% trans %}user.last_editing_user{% endtrans %} + {% if is_granted('show_users', part) %} + {{ getLastEditingUser(part).fullName(true) ?? 'Unknown'|trans }} + {% else %} + {% trans %}accessDenied{% endtrans %} + {% endif %} + + + {# ID #} {% trans %}id.label{% endtrans %} {{ part.iD }} ({{ part.iDString}}) diff --git a/templates/Parts/info/_sidebar.html.twig b/templates/Parts/info/_sidebar.html.twig index ca635b08..2d3f715a 100644 --- a/templates/Parts/info/_sidebar.html.twig +++ b/templates/Parts/info/_sidebar.html.twig @@ -2,11 +2,11 @@

- {{ part.lastModified | format_datetime("short") }} + {{ helper.date_user_combination(part, true) }}
- {{ part.addedDate | format_datetime("short") }} + {{ helper.date_user_combination(part, false) }}
diff --git a/templates/helper.twig b/templates/helper.twig index 616bb6e7..9b2be38e 100644 --- a/templates/helper.twig +++ b/templates/helper.twig @@ -88,4 +88,27 @@ {% else %} {% endif %} +{% endmacro %} + +{% macro date_user_combination(entity, lastModified, datetime_format = "short") %} + {% if lastModified == true %} + {{ entity.lastModified | format_datetime(datetime_format) }} + {% else %} + {{ entity.addedDate | format_datetime(datetime_format) }} + {% endif %} + {% if is_granted('show_users', entity) %} + {% if lastModified == true %} + {% set user = getLastEditingUser(entity) %} + {% else %} + {% set user = getCreatingUser(entity) %} + {% endif %} + + {% if user is not null %} + {% if user.fullName is not empty %} + ({{ user.fullName }}) + {% else %} + (@{{ user.name }}) + {% endif %} + {% endif %} + {% endif %} {% endmacro %} \ No newline at end of file