File indexing completed on 2024-05-12 05:10:43

0001 /*
0002   SPDX-FileCopyrightText: 2014 Sandro Knauß <knauss@kolabsys.com>
0003 
0004   SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "calfilterpartstatusproxymodel_p.h"
0008 #include "calendarutils.h"
0009 #include "utils_p.h"
0010 
0011 #include <Akonadi/Collection>
0012 #include <Akonadi/EntityTreeModel>
0013 #include <Akonadi/Item>
0014 
0015 #include <KCalendarCore/Incidence>
0016 // #include <email.h>
0017 
0018 #include <KIdentityManagementCore/IdentityManager>
0019 
0020 using namespace Akonadi;
0021 
0022 class Akonadi::CalFilterPartStatusProxyModelPrivate
0023 {
0024 public:
0025     explicit CalFilterPartStatusProxyModelPrivate()
0026         : mIdentityManager(KIdentityManagementCore::IdentityManager::self())
0027     {
0028     }
0029 
0030     QList<KCalendarCore::Attendee::PartStat> mBlockedStatusList;
0031     KIdentityManagementCore::IdentityManager *const mIdentityManager;
0032     bool mFilterVirtual = false;
0033 };
0034 
0035 void CalFilterPartStatusProxyModel::slotIdentitiesChanged()
0036 {
0037     invalidate();
0038 }
0039 
0040 CalFilterPartStatusProxyModel::CalFilterPartStatusProxyModel(QObject *parent)
0041     : QSortFilterProxyModel(parent)
0042     , d(new CalFilterPartStatusProxyModelPrivate())
0043 {
0044     QObject::connect(d->mIdentityManager,
0045                      qOverload<>(&KIdentityManagementCore::IdentityManager::changed),
0046                      this,
0047                      &CalFilterPartStatusProxyModel::slotIdentitiesChanged);
0048 }
0049 
0050 CalFilterPartStatusProxyModel::~CalFilterPartStatusProxyModel() = default;
0051 
0052 const QList<KCalendarCore::Attendee::PartStat> &CalFilterPartStatusProxyModel::blockedStatusList() const
0053 {
0054     return d->mBlockedStatusList;
0055 }
0056 
0057 void CalFilterPartStatusProxyModel::setBlockedStatusList(const QList<KCalendarCore::Attendee::PartStat> &blockStatusList)
0058 {
0059     d->mBlockedStatusList = blockStatusList;
0060 }
0061 
0062 bool CalFilterPartStatusProxyModel::filterVirtual() const
0063 {
0064     return d->mFilterVirtual;
0065 }
0066 
0067 void CalFilterPartStatusProxyModel::setFilterVirtual(bool filterVirtual)
0068 {
0069     d->mFilterVirtual = filterVirtual;
0070 }
0071 
0072 bool CalFilterPartStatusProxyModel::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const
0073 {
0074     const QModelIndex idx = sourceModel()->index(source_row, 0, source_parent);
0075     if (!idx.isValid()) {
0076         return false;
0077     }
0078 
0079     const auto item = idx.data(Akonadi::EntityTreeModel::ItemRole).value<Akonadi::Item>();
0080     if (!item.isValid()) {
0081         return false;
0082     }
0083 
0084     const KCalendarCore::Incidence::Ptr incidence = CalendarUtils::incidence(item);
0085     if (!incidence) {
0086         return false;
0087     }
0088 
0089     // Incidences from virtual collections are always ok
0090     const auto col = idx.data(Akonadi::EntityTreeModel::ParentCollectionRole).value<Akonadi::Collection>();
0091     if (!d->mFilterVirtual && col.isVirtual()) {
0092         return true;
0093     }
0094 
0095     // always show if we are the organizer
0096     if (CalendarUtils::thatIsMe(incidence->organizer().email())) {
0097         return true;
0098     }
0099 
0100     const auto attendees = incidence->attendees();
0101     for (const KCalendarCore::Attendee &attendee : attendees) {
0102         if (CalendarUtils::thatIsMe(attendee)) {
0103             return !d->mBlockedStatusList.contains(attendee.status());
0104         }
0105     }
0106 
0107     // We are not attendee, so we accept the incidence
0108     return true;
0109 }
0110 
0111 #include "moc_calfilterpartstatusproxymodel_p.cpp"