Index: server/lib/gutenbach/server/printer.py
===================================================================
--- server/lib/gutenbach/server/printer.py	(revision c1cebbcf97fff8e0b0b1edaee02c56cee3397bf7)
+++ server/lib/gutenbach/server/printer.py	(revision 9da74281f4f9e57fbb1af7c080015a369dbf9984)
@@ -185,28 +185,49 @@
     def printer_uri_supported(self):
         return ipp.PrinterUriSupported(self.uri)
+    @printer_uri_supported.setter
+    def printer_uri_supported(self, val):
+        raise ipp.errors.AttributesNotSettable("printer-uri-supported")
 
     @property
     def uri_authentication_supported(self):
         return ipp.UriAuthenticationSupported("none")
+    @uri_authentication_supported.setter
+    def uri_authentication_supported(self, val):
+        raise ipp.errors.AttributesNotSettable("uri-authentication-supported")
 
     @property
     def uri_security_supported(self):
         return ipp.UriSecuritySupported("none")
+    @uri_security_supported.setter
+    def uri_security_supported(self, val):
+        raise ipp.errors.AttributesNotSettable("uri-security-supported")
 
     @property
     def printer_name(self):
         return ipp.PrinterName(self.name)
+    @printer_name.setter
+    def printer_name(self, val):
+        raise ipp.errors.AttributesNotSettable("printer-name")
 
     @property
     def printer_state(self):
         return ipp.PrinterState(self.state)
+    @printer_state.setter
+    def printer_state(self, val):
+        raise ipp.errors.AttributesNotSettable("printer-state")
 
     @property
     def printer_state_reasons(self):
         return ipp.PrinterStateReasons("none")
+    @printer_state_reasons.setter
+    def printer_state_reasons(self, val):
+        raise ipp.errors.AttributesNotSettable("printer-state-reasons")
 
     @property
     def ipp_versions_supported(self):
         return ipp.IppVersionsSupported(*self.config['ipp-versions'])
+    @ipp_versions_supported.setter
+    def ipp_versions_supported(self, val):
+        raise ipp.errors.AttributesNotSettable("ipp-versions-supported")
 
     # XXX: We should query ourself for the supported operations
@@ -214,56 +235,98 @@
     def operations_supported(self):
         return ipp.OperationsSupported(ipp.OperationCodes.GET_JOBS)
+    @operations_supported.setter
+    def operations_supported(self, val):
+        raise ipp.errors.AttributesNotSettable("operations-supported")
 
     @property
     def charset_configured(self):
-        return ipp.CharsetConfigured("utf-8")
-
+        return ipp.CharsetConfigured("utf-8") # XXX
+    @charset_configured.setter
+    def charset_configured(self, val):
+        raise ipp.errors.AttributesNotSettable("charset-configured")
+        
     @property
     def charset_supported(self):
-        return ipp.CharsetSupported("utf-8")
+        return ipp.CharsetSupported("utf-8") # XXX
+    @charset_supported.setter
+    def charset_supported(self, val):
+        raise ipp.errors.AttributesNotSettable("charset-supported")
 
     @property
     def natural_language_configured(self):
         return ipp.NaturalLanguageConfigured("en-us")
+    @natural_language_configured.setter
+    def natural_language_configured(self, val):
+        raise ipp.errors.AttributesNotSettable("natural-language-configured")
 
     @property
     def generated_natural_language_supported(self):
         return ipp.GeneratedNaturalLanguageSupported("en-us")
+    @generated_natural_language_supported.setter
+    def generated_natural_language_supported(self, val):
+        raise ipp.errors.AttributesNotSettable("generated-natural-language-supported")
 
     @property
     def document_format_default(self):
         return ipp.DocumentFormatDefault("application/octet-stream")
+    @document_format_default.setter
+    def document_format_default(self, val):
+        raise ipp.errors.AttributesNotSettable("document-format-default")
 
     @property
     def document_format_supported(self):
         return ipp.DocumentFormatSupported("application/octet-stream", "audio/mp3")
+    @document_format_supported.setter
+    def document_format_supported(self, val):
+        raise ipp.errors.AttributesNotSettable("document-format-supported")
 
     @property
     def printer_is_accepting_jobs(self):
         return ipp.PrinterIsAcceptingJobs(True)
+    @printer_is_accepting_jobs.setter
+    def printer_is_accepting_jobs(self, val):
+        raise ipp.errors.AttributesNotSettable("printer-is-accepting-jobs")
 
     @property
     def queued_job_count(self):
         return ipp.QueuedJobCount(len(self.active_jobs))
+    @queued_job_count.setter
+    def queued_job_count(self, val):
+        raise ipp.errors.AttributesNotSettable("queued-job-count")
 
     @property
     def pdl_override_supported(self):
         return ipp.PdlOverrideSupported("not-attempted")
+    @pdl_override_supported.setter
+    def pdl_override_supported(self, val):
+        raise ipp.errors.AttributesNotSettable("pdl-override-supported")
 
     @property
     def printer_up_time(self):
         return ipp.PrinterUpTime(int(time.time()) - self.time_created)
+    @printer_up_time.setter
+    def printer_up_time(self, val):
+        raise ipp.errors.AttributesNotSettable("printer-up-time")
 
     @property
     def compression_supported(self):
         return ipp.CompressionSupported("none")
+    @compression_supported.setter
+    def compression_supported(self, val):
+        raise ipp.errors.AttributesNotSettable("compression-supported")
 
     @property
     def multiple_operation_time_out(self):
         return ipp.MultipleOperationTimeOut(240)
+    @multiple_operation_time_out.setter
+    def multiple_operation_time_out(self, val):
+        raise ipp.errors.AttributesNotSettable("multiple-operation-time-out")
 
     @property
     def multiple_document_jobs_supported(self):
         return ipp.MultipleDocumentJobsSupported(False)
+    @multiple_document_jobs_supported.setter
+    def multiple_document_jobs_supported(self, val):
+        raise ipp.errors.AttributesNotSettable("multiple-document-jobs-supported")
 
     ######################################################################
@@ -366,6 +429,10 @@
         return attributes
 
-    def set_printer_attributes(self):
-        pass
+    def set_printer_attributes(self, job_id, attributes):
+        for attr in attributes:
+            try:
+                setattr(self, attr, attributes[attr])
+            except AttributeError:
+                raise ipp.errors.ClientErrorAttributes
 
     def cancel_job(self, job_id, requesting_user_name=None):
@@ -399,7 +466,14 @@
         return attributes
 
-    def set_job_attributes(self):
-        pass
-
+    def set_job_attributes(self, job_id, attributes):
+        job = self.get_job(job_id)
+        for attr in attributes:
+            if attr in ("job-id", "job-k-octets", "job-state", "job-printer-uri"):
+                raise ipp.errors.ClientErrorAttributesNotSettable(attr)
+            elif attr == "job-name":
+                job.name = attributes[attr]
+            elif attr == "job-originating-user-name":
+                job.creator = attributes[attr] # XXX: do we want this?
+                
     def restart_job(self, job_id, requesting_user_name=None):
         job = self.get_job(job_id)
