Akonadi.Attribute

KDE 4.2 PyKDE API Reference

- KDE's Python API

# Attribute Class Reference

`from PyKDE4.akonadi import *`

Subclasses: Akonadi.EntityDisplayAttribute, Akonadi.MessageThreadingAttribute
Namespace: Akonadi

## Detailed Description

Abstract class:
  This class can be used as a base class for new classes, but can not be instantiated directly.

Provides interface for custom attributes for Entity.

This class is an interface for custom attributes, that can be stored in an entity. Attributes should be meta data, e.g. ACLs, quotas etc. that are not part of the entities' data itself.

To provide custom attributes, you have to subclass from this interface and reimplement the pure virtual methods.

     class SecrecyAttribute : public Akonadi.Attribute
     {
        public:
          enum Secrecy
          {
            Public,
            Private,
            Confidential
          };

          SecrecyAttribute( Secrecy secrecy = Public )
            : mSecrecy( secrecy )
          {
          }

          void setSecrecy( Secrecy secrecy )
          {
            mSecrecy = secrecy;
          }

          Secrecy secrecy() const
          {
            return mSecrecy;
          }

          virtual QByteArray type() const
          {
            return "secrecy";
          }

          virtual Attribute* clone() const
          {
            return new SecrecyAttribute( mSecrecy );
          }

          virtual QByteArray serialized() const
          {
            switch ( mSecrecy ) {
              case Public: return "public"; break;
              case Private: return "private"; break;
              case Confidential: return "confidential"; break;
            }
          }

          virtual void deserialize( const QByteArray &data )
          {
            if ( data == "public" )
              mSecrecy = Public;
            else if ( data == "private" )
              mSecrecy = Private;
            else if ( data == "confidential" )
              mSecrecy = Confidential;
          }
     }

Additionally, you need to register your attribute with Akonadi.AttributeFactory for automatic deserialization during retrieving of collecitons or items:

     AttributeFactory.registerAttribute<SecrecyAttribute>();

Third party attributes need to be registered once by each application that uses them. So the above snippet needs to be in the resource that adds the attribute, and each application that uses the resource. This may be simplified in the future.

The custom attributes can be used in the following way:

     Akonadi.Item item( "text/directory" );
     SecrecyAttribute* attr = item.attribute<SecrecyAttribute>( Item.AddIfMissing );
     attr->setSecrecy( SecrecyAttribute.Confidential );

and

     Akonadi.Item item = ...

     if ( item.hasAttribute<SecrecyAttribute>() ) {
       SecrecyAttribute *attr = item.attribute<SecrecyAttribute>();

       SecrecyAttribute.Secrecy secrecy = attr->secrecy();
       ...
     }

Author:
  Volker Krause <vkrause@kde.org>

## Methods
Akonadi.Attribute | clone (self)
| deserialize (self, QByteArray data)
QByteArray | serialized (self)
QByteArray | type (self)

## Method Documentation

Akonadi.Attribute clone | ( |  | self ) |

Abstract method:
  This method is abstract and can be overridden but not called directly.

Creates a copy of this attribute.

deserialize | ( | self, |
|  | QByteArray | data
| ) |  |  |

Abstract method:
  This method is abstract and can be overridden but not called directly.

Sets the data of this attribute, using the same encoding as returned by toByteArray().

Parameters:

  | data | The encoded attribute data.

QByteArray serialized | ( |  | self ) |

Abstract method:
  This method is abstract and can be overridden but not called directly.

Returns a QByteArray representation of the attribute which will be storaged. This can be raw binary data, no encoding needs to be applied.

QByteArray type | ( |  | self ) |

Abstract method:
  This method is abstract and can be overridden but not called directly.

Returns the type of the attribute.