xotcl.wu-wien.ac.at
Begin main content
Methods: Source: Variables:
[All Methods | Documented Methods | Hide Methods] [Display Source | Hide Source] [Show Variables | Hide Variables]

::xo::db::CrClass[i] ::xo::db::CrItem

Class Hierarchy of ::xo::db::CrItem

  • ::xotcl::Object[i]
    Meta-class:
    ::xotcl::Class[i]
    Methods for instances:
    __api_make_doc, __api_make_forward_doc, __timediff, abstract, ad_doc, ad_forward, ad_proc, appendC, arrayC, asHTML, autonameC, check, classC, cleanupC, configureC, containsC, copyC, db_0or1rowC, db_1rowC, debug, defaultmethodC, destroyC, destroy_on_cleanup, ds, evalC, existsC, extractConfigureArg, filterC, filterguardC, filtersearch, forward, hasclass, incrC, infoC, init, instvarC, invarC, isclass, ismetaclass, ismixin, isobject, istype, lappendC, log, method, mixinC, mixinguardC, moveC, msg, noinitC, objectparameter, parametercmdC, proc, procsearch, qn, requireNamespaceC, residualargsC, self, serialize, setC, set_instance_vars_defaults, show-object, substC, traceC, unknown, unsetC, uplevelC, upvarC, volatileC, vwait
    Methods to be applied on the class (in addition to the methods provided by the meta-class):
    getExitHandler, setExitHandler, unsetExitHandler
    • ::xo::db::Object[i]
      Meta-class:
      ::xo::db::Class[i]
      Methods for instances:
      db_1row, delete, initialize_loaded_object, insert, object_idC, object_titleC, save, save_new
      Methods to be applied on the class:
      Methods provided by the meta-class
      • ::xo::db::CrItem[i]
        Meta-class:
        ::xo::db::CrClass[i]
        Parameter for instances:
        package_id, parent_id (default "-100"), publish_status (default "ready")
        Methods for instances:
        current_user_id, delete, descriptionC, fix_content, initialize_loaded_object, item_idC, mime_typeC, nameC, nls_languageC, privilege=creator, publish_dateC, rename, revision_idC, revisions, save, save_new, set_live_revision, textC, titleC, update_attribute_from_slot, update_content, update_revision
        Methods to be applied on the class:
        Methods provided by the meta-class

Class Relations

  • superclass: ::xo::db::Object[i]
  • instmixin: ::xo::db::CrCache::Item[i]
  • subclass: ::xo::db::CrFolder[i], ::xo::db::image[i], ::xowiki::Page[i]
::xo::db::CrClass create ::xo::db::CrItem \
     -superclass ::xo::db::Object \
     -parameter {package_id {parent_id -100} {publish_status ready}} \
     -instmixin ::xo::db::CrCache::Item

Methods

  • instproc delete (public)

    <instance of ::xo::db::CrItem[i]> delete
    Delete the item from the content repositiory with the item_id taken from the instance variable.

    ::xowiki::policy5 instproc delete {} {
        # delegate deletion to the class
        [my info class] delete -item_id [my set item_id]
      }
    
  • instproc privilege=creator (public)

    <instance of ::xo::db::CrItem[i]> privilege=creator \
        [ -login login ] user_id package_id method
    Define an object specific privilege to be used in the policies. Grant access to a content item for the creator (creation_user) of the item, and for the package admin.

    Switches:
    -login (defaults to "true") (optional)
    Parameters:
    user_id
    package_id
    method
    ::xowiki::policy5 instproc privilege=creator {{-login true} user_id package_id method} {
        set allowed 0
        #my log "--checking privilege [self args]"
        if {[my exists creation_user]} {
          if {[my set creation_user] == $user_id} {
            set allowed 1
          } else {
            # allow the package admin always access
            set allowed [::xo::cc permission  -object_id $package_id  -party_id $user_id  -privilege admin]
          }
        }
        return $allowed
      }
    
  • instproc rename (public)

    <instance of ::xo::db::CrItem[i]> rename -old_name old_name  \
        -new_name new_name 
    Rename a content item

    Switches:
    -old_name (required)
    -new_name (required)
    ::xowiki::policy5 instproc rename {-old_name:required -new_name:required} {
        db_dml [my qn update_rename] "update cr_items set name = :new_name  where item_id = [my item_id]"
      }
    
  • instproc save (public)

    <instance of ::xo::db::CrItem[i]> save \
        [ -modifying_user modifying_user ] [ -live_p on|off ] \
        [ -use_given_publish_date on|off ]
    Updates an item in the content repository. We insert a new revision instead of changing the current revision.

    Switches:
    -modifying_user (optional)
    -live_p (boolean) (defaults to "true") (optional)
    make this revision the live revision
    -use_given_publish_date (boolean) (defaults to "false") (optional)
    ::xowiki::policy5 instproc save {-modifying_user {-live_p:boolean true} {-use_given_publish_date:boolean false}} {
        #my instvar creation_user
        set __atts [list creation_user]
        set __vars $__atts
        
        # The modifying_user is not maintained by the CR (bug?)
        # xotcl-core handles this by having the modifying user as
        # creation_user of the revision.
        #
        # Caveat: the creation_user fetched is different if we fetch via
        # item_id (the creation_user is the creator of the item) or if we
        # fetch via revision_id (the creation_user is the creator of the
        # revision)
    
        set creation_user [expr {[info exists modifying_user] ?
                                 $modifying_user :
                                 [my current_user_id]}]
        #set old_revision_id [my set revision_id]
    
        foreach {__slot_name __slot} [[my info class] array get db_slot] {
          if {
    	  $__slot eq "::xo::db::Object::slot::object_title" ||
    	  $__slot eq "::xo::db::CrItem::slot::name" ||
              $__slot eq "::xo::db::CrItem::slot::publish_date"
    	} continue
          my instvar $__slot_name
          lappend __atts [$__slot column_name]
          lappend __vars $__slot_name
        }
    
        [self class] instvar insert_view_operation
        db_transaction {
          [my info class] instvar storage_type
          set revision_id [db_nextval acs_object_id_seq]
          if {$storage_type eq "file"} {
            my instvar import_file
            set text [cr_create_content_file $item_id $revision_id $import_file]
          }
          $insert_view_operation [my qn revision_add]  [[my info class] insert_statement $__atts $__vars]
    
          my fix_content $revision_id $text
          if {$live_p} {
            ::xo::db::sql::content_item set_live_revision  -revision_id $revision_id  -publish_status [my set publish_status]
            #
            # set_live revision updates publish_date to the current date.
            # In order to keep a given publish date, we have to update the
            # field manually.
            #
            if {$use_given_publish_date} {
              my update_revision $revision_id publish_date [my publish_date]
            }
            my set revision_id $revision_id
          } else {
            # if we do not make the revision live, use the old revision_id,
            # and let CrCache save it ...... TODO: is this still needed? comment out for testing
            #set revision_id $old_revision_id
          }
          my set modifying_user $creation_user
          my db_1row [my qn get_dates] {
            select last_modified 
            from acs_objects where object_id = :revision_id
          }
        }
        return $item_id
      }
    
  • instproc save_new (public)

    <instance of ::xo::db::CrItem[i]> save_new \
        [ -package_id package_id ] [ -creation_user creation_user ] \
        [ -creation_ip creation_ip ] [ -live_p on|off ] \
        [ -use_given_publish_date on|off ]
    Insert a new item to the content repository

    Switches:
    -package_id (optional)
    -creation_user (optional)
    user_id if the creating user
    -creation_ip (optional)
    -live_p (boolean) (defaults to "true") (optional)
    make this revision the live revision
    -use_given_publish_date (boolean) (defaults to "false") (optional)
    ::xowiki::policy5 instproc save_new {-package_id -creation_user -creation_ip {-live_p:boolean true} {-use_given_publish_date:boolean false}} {
        set __class [my info class]
        my instvar parent_id item_id import_file name
        if {![info exists package_id] && [my exists package_id]} {
          set package_id [my package_id]
        }
        [self class] get_context package_id creation_user creation_ip
        my set creation_user $creation_user
        set __atts  [list creation_user]
        set __vars $__atts
    
        #my log "db_slots for $__class: [$__class array get db_slot]"
        foreach {__slot_name __slot} [$__class array get db_slot] {
          #my log "--slot = $__slot"
          if {
    	  $__slot eq "::xo::db::Object::slot::object_title" ||
    	  $__slot eq "::xo::db::CrItem::slot::name" ||
              $__slot eq "::xo::db::CrItem::slot::publish_date"
    	} continue
          my instvar $__slot_name
          if {![info exists $__slot_name]} {set $__slot_name ""}
          lappend __atts [$__slot column_name]
          lappend __vars $__slot_name
        }
    
        [self class] instvar insert_view_operation
    
        db_transaction {
          $__class instvar storage_type object_type
          [self class] lock acs_objects "SHARE ROW EXCLUSIVE"
          set revision_id [db_nextval acs_object_id_seq]
    
          if {![my exists name] || $name eq ""} {
    	# we have an autonamed item, use a unique value for the name
    	set name [expr {[my exists __autoname_prefix] ? 
                            "[my set __autoname_prefix]$revision_id" : $revision_id}]
          }
          if {$title eq ""} {
            set title [expr {[my exists __title_prefix] ? 
                             "[my set __title_prefix] ($name)" : $name}]
          }
          #my msg --[subst [[self class] set content_item__new_args]]
          set item_id [eval ::xo::db::sql::content_item new  [[self class] set content_item__new_args]]
          if {$storage_type eq "file"} {
            set text [cr_create_content_file $item_id $revision_id $import_file]
          }
    
          $insert_view_operation [my qn revision_add]  [[my info class] insert_statement $__atts $__vars]
          my fix_content $revision_id $text
    
          if {$live_p} {
            ::xo::db::sql::content_item set_live_revision  -revision_id $revision_id  -publish_status [my set publish_status] 
            if {$use_given_publish_date} {
              my update_revision $revision_id publish_date [my publish_date]
            }
          }
        }
        my set revision_id $revision_id
        my db_1row [my qn get_dates] {
          select creation_date, last_modified 
          from acs_objects where object_id = :revision_id
        }
        my set object_id $item_id
        return $item_id
      }
    
  • instproc set_live_revision (public)

    <instance of ::xo::db::CrItem[i]> set_live_revision \
        -revision_id revision_id  [ -publish_status publish_status ]

    Switches:
    -revision_id (required)
    -publish_status (defaults to "ready") (optional)
    one of 'live', 'ready' or 'production'
    ::xowiki::policy5 instproc set_live_revision {-revision_id:required {-publish_status "ready"}} {
        ::xo::db::sql::content_item set_live_revision  -revision_id $revision_id  -publish_status $publish_status
        ::xo::clusterwide ns_cache flush xotcl_object_cache ::[my item_id]
      }
    

Methods: Source: Variables:
[All Methods | Documented Methods | Hide Methods] [Display Source | Hide Source] [Show Variables | Hide Variables]